Search Unity

Diablo movement (almost complete)

Discussion in 'Scripting' started by SteveZantes, Nov 29, 2010.

  1. SteveZantes

    SteveZantes

    Joined:
    Nov 29, 2010
    Posts:
    13
    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". :)

    Code (csharp):
    1.  
    2. [COLOR="green"]var obj:Transform;
    3. var Terr:TerrainData;
    4. var LimitTerrain:float = 5.0;
    5. var hit:RaycastHit;
    6. var move: boolean = false;
    7. var speed: float;
    8. private var typeMovementX: int;
    9. private var typeMovementZ: int;
    10.  
    11. function Update ()
    12. {
    13.      
    14.     if(Input.GetKeyDown("left ctrl"))
    15.     {
    16.         speed = speed * 4;
    17.     }
    18.    
    19.     if(Input.GetKeyUp("left ctrl"))
    20.     {
    21.         speed = speed / 4;
    22.     }
    23.  
    24.     if(Input.GetKeyDown(KeyCode.Mouse0))
    25.     {
    26.         var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    27.             if (Physics.Raycast (ray, hit, 10000))
    28.             {
    29.                 if(hit.point.x >= obj.position.x)
    30.                 {
    31.                     typeMovementX=0;
    32.                 }
    33.                 else
    34.                 {
    35.                     typeMovementX=1;
    36.                 }
    37.                
    38.                  if(hit.point.z >= obj.position.z)
    39.                 {
    40.                     typeMovementZ=0;
    41.                 }
    42.                 else
    43.                 {
    44.                     typeMovementZ=1;
    45.                 }
    46.                  move = true;
    47.             }
    48.     }  
    49.     if(move)
    50.     {
    51.         //Muovo il giocatore
    52.         var movePos = Vector3(hit.point.x,7,hit.point.z);
    53.         MovePlayer(speed,movePos,hit,typeMovementX,typeMovementZ);
    54.         if(move == true)
    55.         {
    56.             if(obj.transform.position == hit.point)
    57.             {
    58.                 //Se il giocatore ha raggiunto la posizione, lo blocco
    59.                 move = false;
    60.             }
    61.         }      
    62.     }
    63. }
    64.  
    65. function MovePlayer (speed : int, movePos : Vector3 ,hit : RaycastHit,typeMovementX : int,typeMovementZ : int)
    66. {
    67.     var dist = Vector3.Distance (obj.transform.position, movePos);
    68.     var pos:Vector3;
    69.     //obj.transform.LookAt(movePos);
    70.     for (i = 0.0; i < 1.0; i += (speed * Time.deltaTime) / (dist * 20))
    71.     {
    72.         //Controllo le coordinate dove si deve muovere il giocatore
    73.         if(typeMovementX==0  typeMovementZ==0)
    74.         {
    75.             pos=Vector3(transform.position.x+1,7,transform.position.z+1);
    76.         }
    77.         else
    78.         {
    79.             if(typeMovementX==1  typeMovementZ==1)
    80.             {
    81.                 pos=Vector3(transform.position.x-1,7,transform.position.z-1);  
    82.             }
    83.             else
    84.             {
    85.                 if(typeMovementX==0  typeMovementZ==1)
    86.                 {
    87.                     pos=Vector3(transform.position.x+1,7,transform.position.z-1);  
    88.                 }  
    89.                 else
    90.                 {
    91.                     if(typeMovementX==1  typeMovementZ==0)
    92.                     {
    93.                         pos=Vector3(transform.position.x-1,7,transform.position.z+1);  
    94.                     }  
    95.                 }
    96.             }
    97.         }
    98.                        
    99.         //Se il personaggio trova un collider si ferma
    100.         if(Physics.Linecast(transform.position,pos))
    101.         {
    102.             move = false;
    103.             break;
    104.         }
    105.         else
    106.         {
    107.             //Se la posizione in cui si vuole andare è all'interno del limite, il personaggio si può muovere
    108.             if((pos.x < (Terr.size.x - LimitTerrain))  (pos.x>LimitTerrain)  (pos.z < (Terr.size.z-LimitTerrain))  (pos.z>LimitTerrain))
    109.             {
    110.                 obj.transform.position = Vector3.Lerp(obj.transform.position, movePos, i);
    111.                 yield;
    112.                 if (Input.GetKeyDown(KeyCode.Mouse0))
    113.                 {
    114.                     i = 1.0;
    115.                 }
    116.             }
    117.             else
    118.             {
    119.                 //Blocco il movimento
    120.                 move = false;
    121.                 break;
    122.             }
    123.         }
    124.     }
    125. }[/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. :)
     
    Last edited: Dec 2, 2010
  2. SteveZantes

    SteveZantes

    Joined:
    Nov 29, 2010
    Posts:
    13
    This new code fixed the Y coordinate... Now the character move according to the slope of the terrain. :D

    Code (csharp):
    1.  
    2. [COLOR="green"]var obj:Transform;
    3. var Terr:TerrainData;
    4. var LimitTerrain:float = 5.0;
    5. var hit:RaycastHit;
    6. var move: boolean = false;
    7. var speed: float;
    8. private var typeMovementX: int;
    9. private var typeMovementZ: int;
    10.  
    11. function Update ()
    12. {[indent]
    13. if(Input.GetKeyDown("left ctrl"))
    14. {[indent]speed = speed * 4;[/indent]}
    15. if(Input.GetKeyUp("left ctrl"))
    16. { [indent]speed = speed / 4;[/indent]
    17. }
    18. if(Input.GetKeyDown(KeyCode.Mouse0))
    19. {[indent]
    20.  var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    21.  if (Physics.Raycast (ray, hit, 10000))
    22.  {
    23.  [indent]if(hit.point.x >= obj.position.x)
    24. {
    25. [indent]typeMovementX=0;[/indent]
    26. }
    27. else
    28. {
    29. [indent]typeMovementX=1;[/indent]
    30. }
    31.  
    32. if(hit.point.z >= obj.position.z)
    33. {
    34. [indent]typeMovementZ=0;[/indent]
    35. }
    36. else
    37. {
    38. [indent]typeMovementZ=1;[/indent]
    39. }
    40. move = true;
    41. }[/indent]
    42. }[/indent] 
    43. [indent]if(move)
    44. {
    45. [indent]//Muovo il giocatore
    46. var movePos = Vector3(hit.point.x,[COLOR="red"]Terra.activeTerrain.SampleHeight(obj.transform.position)+1[/COLOR],hit.point.z);
    47. MovePlayer(speed,movePos,hit,typeMovementX,typeMov ementZ);
    48. if(move == true)
    49. {
    50. [indent]if(obj.transform.position == hit.point)
    51. {
    52. [indent]//Se il giocatore ha raggiunto la posizione, lo blocco
    53. move = false;[/indent]
    54. }[/indent]
    55. } [/indent]
    56. }[/indent]
    57. }
    58.  
    59.  
    60. function MovePlayer (speed : int, movePos : Vector3 ,hit : RaycastHit,typeMovementX : int,typeMovementZ : int)
    61. {
    62. [indent]
    63. var dist = Vector3.Distance (obj.transform.position, movePos);
    64. var pos:Vector3;
    65. //obj.transform.LookAt(movePos);
    66. for (i = 0.0; i < 1.0; i += (speed * Time.deltaTime) / (dist * 20))
    67. {
    68. [indent]
    69. //Controllo le coordinate dove si deve muovere il giocatore
    70. [COLOR="red"] if(typeMovementX==0  typeMovementZ==0)
    71.         {
    72. [indent]
    73. pos=Vector3(transform.position.x+1,Terra.activeTerrain.SampleHeight(obj.transform.position)+1,transform.position.z+1);
    74. [/indent]
    75.         }
    76.         else
    77.         {
    78. [indent]
    79.             if(typeMovementX==1  typeMovementZ==1)
    80.             {
    81. [indent]
    82.                 pos=Vector3(transform.position.x-1,Terra.activeTerrain.SampleHeight(obj.transform.position)+1,transform.position.z-1);  [/indent]
    83.             }
    84.             else
    85.             {
    86. [indent]
    87.                 if(typeMovementX==0  typeMovementZ==1)
    88.                 {
    89.                     [indent]pos=Vector3(transform.position.x+1,Terra.activeTerrain.SampleHeight(obj.transform.position)+1,transform.position.z-1);  [/indent]
    90.                 }  
    91.                 else
    92.                 {
    93. [indent]
    94.                     if(typeMovementX==1  typeMovementZ==0)
    95.                     {
    96. [indent]
    97.                         pos=Vector3(transform.position.x-1,Terra.activeTerrain.SampleHeight(obj.transform.position)+1,transform.position.z+1);  
    98.                    [/indent] }  
    99.                 [/indent]}
    100.            [/indent] }
    101.         [/indent]}[/COLOR]
    102. //Se il personaggio trova un collider si ferma
    103. if(Physics.Linecast(transform.position,pos))
    104. {
    105. [indent]
    106. move = false;
    107. break;[/indent]
    108. }
    109. else
    110. {
    111. [indent]//Se la posizione in cui si vuole andare è all'interno del limite, il personaggio si può muovere
    112. if((pos.x < (Terr.size.x - LimitTerrain))  (pos.x>LimitTerrain)  (pos.z < (Terr.size.z-LimitTerrain))  (pos.z>LimitTerrain))
    113. {[indent]
    114. [COLOR="red"]obj.transform.position = Vector3.Lerp(obj.transform.position, Vector3(movePos.x,pos.y,movePos.z), i);[/COLOR]
    115. yield;
    116. if (Input.GetKeyDown(KeyCode.Mouse0))
    117. {[indent]i = 1.0;[/indent]}[/indent]}
    118. else
    119. {
    120. [indent]//Blocco il movimento
    121. move = false;
    122. break;[/indent]
    123. }
    124. }[/indent]
    125. }[/indent]
    126. }[/indent][/COLOR]
     
    Last edited: Dec 2, 2010
  3. Quietus2

    Quietus2

    Joined:
    Mar 28, 2008
    Posts:
    2,058
    Hello Steve,

    Thanks for the contribution and welcome to the community! You might consider putting it on the Unity Wiki.

    Fyi though, in the future you might want to use the bbcode code tags. It keeps all your indentation and formatting. People tend to hit the back button otherwise, as it's very difficult to read.
     
  4. SteveZantes

    SteveZantes

    Joined:
    Nov 29, 2010
    Posts:
    13
    Hi Quietus!
    I've changed the indentation of the code... Is this correct now? :)
     
  5. BHS

    BHS

    Joined:
    Dec 21, 2009
    Posts:
    4,764
    Hey did you get the code working? If you did could you post it (in English) I was looking for the exact same thing I'm making a Diablo style game thanks
     
  6. Ezzerland

    Ezzerland

    Joined:
    Jul 1, 2010
    Posts:
    405
    he actually means to wrap your code with code tags. [ code ] and [ /code ] (without the spaces) so that it looks like your quote does above.
     
  7. SteveZantes

    SteveZantes

    Joined:
    Nov 29, 2010
    Posts:
    13
    Yeah!
    Try it if you want and tell me if it does work correctly! :)
     
  8. zumwalt

    zumwalt

    Joined:
    Apr 18, 2007
    Posts:
    2,287
    What are you attaching the code to? A camera? The player controller or a simple game object?
     
  9. SteveZantes

    SteveZantes

    Joined:
    Nov 29, 2010
    Posts:
    13
    This script must be attached to a game object.
    In my case i have a capsule object (with main camera inside it), and i put this code in the capsule.
    - obj --> capsule;
    - Terra --> terrain;
    - Terr --> terraindata;

    Game object could be an imported model also if you want :D.