Hi all guys.
I’m new in the Unity Community, and i think tath Unity3d is a fantastic software!!
My first post wants to be useful for anyone who would like to apply the “click to move style game Diablo”.
[COLOR="green"]var obj:Transform;
var Terr:TerrainData;
var LimitTerrain:float = 5.0;
var hit:RaycastHit;
var move: boolean = false;
var speed: float;
private var typeMovementX: int;
private var typeMovementZ: int;
function Update ()
{
if(Input.GetKeyDown("left ctrl"))
{
speed = speed * 4;
}
if(Input.GetKeyUp("left ctrl"))
{
speed = speed / 4;
}
if(Input.GetKeyDown(KeyCode.Mouse0))
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, hit, 10000))
{
if(hit.point.x >= obj.position.x)
{
typeMovementX=0;
}
else
{
typeMovementX=1;
}
if(hit.point.z >= obj.position.z)
{
typeMovementZ=0;
}
else
{
typeMovementZ=1;
}
move = true;
}
}
if(move)
{
//Muovo il giocatore
var movePos = Vector3(hit.point.x,7,hit.point.z);
MovePlayer(speed,movePos,hit,typeMovementX,typeMovementZ);
if(move == true)
{
if(obj.transform.position == hit.point)
{
//Se il giocatore ha raggiunto la posizione, lo blocco
move = false;
}
}
}
}
function MovePlayer (speed : int, movePos : Vector3 ,hit : RaycastHit,typeMovementX : int,typeMovementZ : int)
{
var dist = Vector3.Distance (obj.transform.position, movePos);
var pos:Vector3;
//obj.transform.LookAt(movePos);
for (i = 0.0; i < 1.0; i += (speed * Time.deltaTime) / (dist * 20))
{
//Controllo le coordinate dove si deve muovere il giocatore
if(typeMovementX==0 typeMovementZ==0)
{
pos=Vector3(transform.position.x+1,7,transform.position.z+1);
}
else
{
if(typeMovementX==1 typeMovementZ==1)
{
pos=Vector3(transform.position.x-1,7,transform.position.z-1);
}
else
{
if(typeMovementX==0 typeMovementZ==1)
{
pos=Vector3(transform.position.x+1,7,transform.position.z-1);
}
else
{
if(typeMovementX==1 typeMovementZ==0)
{
pos=Vector3(transform.position.x-1,7,transform.position.z+1);
}
}
}
}
//Se il personaggio trova un collider si ferma
if(Physics.Linecast(transform.position,pos))
{
move = false;
break;
}
else
{
//Se la posizione in cui si vuole andare è all'interno del limite, il personaggio si può muovere
if((pos.x < (Terr.size.x - LimitTerrain)) (pos.x>LimitTerrain) (pos.z < (Terr.size.z-LimitTerrain)) (pos.z>LimitTerrain))
{
obj.transform.position = Vector3.Lerp(obj.transform.position, movePos, i);
yield;
if (Input.GetKeyDown(KeyCode.Mouse0))
{
i = 1.0;
}
}
else
{
//Blocco il movimento
move = false;
break;
}
}
}
}[/COLOR]
This type of code allows to move an object (in my case a capsule), when you click the left mouse button on the terrain…
Script contain three particularity:
- Constant velocity for the object;
- Automatically control the collision with collider;
- Limit movement on the terrain;
Now the Y coordinate is fixed to 7 for my test…
I think that the Y should match with the Y of the terrain.