1. //require theCharacterController and a Rigidbody (for trigger) 2. @script RequireComponent(CharacterController) 3. @script RequireComponent(Rigidbody) 4. 5. //not how Iwould have done the animation assignment, but perfectly functional 6. var animation1: String = "idle"; 7. var animation2: String = "walk"; 8. var animation3: String = "run"; 9. var animation4: String = "rotateAround"; 10. 11.//renamedwalkSpeed to moveSpeed for clarity 12.//also added ourrigidbody var which is required to trigger OnTriggerEnter events 13.var walk : float = 1.0; 14.var run : float = 4.0; 15.private var moveSpeed : float = 1.0; 16.private var gravity = 100.0; 17.private var moveDirection : Vector3 = Vector3.zero; 18.private var charController : CharacterController; 19.private var body : Rigidbody; 20.private var climbing : boolean; 21. 22. 23.function Start() 24.{ 25. //assign our variables which linkto other components, and set animation mode 26. charController = GetComponent(CharacterController); 27. body = GetComponent(Rigidbody); 28. body.isKinematic=true; 29. animation.wrapMode = WrapMode.Loop; 30.} 31. 32. 33.function Update () 34.{ 35. //We call Input.GetAxis a lot, solet's just call them once, and store the answer 36. var h : float = Input.GetAxis("Horizontal"); 37. var v : float = Input.GetAxis("Vertical"); 38. 39. //reset our moveDirection variableeach time, just to be safe 40. moveDirection = Vector3.zero; 41. if(climbing) 42. { 43. //we are climbing, so we usedifferent movement rules 44. //we shall use much of the samestructure that is laid out below, because it is a fundamentally good structure 45. //this is not really optimized,and there is probably a more compact way of accomplishing the same goal, butthis is easy to follow. 46. 47. //always use the walk speed 48. moveSpeed = walk; 49. 50. if(v > .1) 51. { 52. //pushing forward 53. moveDirection.y = v * moveSpeed; 54. 55. //in addition to moving updwards,let's push forwards 56. //if we are still on the wall, thewall will push back and this will not matter 57. //if we reach the top of the wall,this will allow us to move to standing on top of it, instead of getting stuckhovering over the trigger 58. moveDirection.z = v * moveSpeed; 59. 60. //perhaps also a climbinganimation? 61. } 62. else if(v < -.1) 63. { 64. //pushing backwards 65. //this is actually the case whenwe care if we are grounded 66. if(charController.isGrounded)//shorthand for== true, it's a boolean itself, after all 67. { 68. //we are already at the bottom ofthe wall, and should move backwards, away from the wall 69. moveDirection.z = v * moveSpeed; 70. } 71. else 72. { 73. //we are not at the bottom, and shouldmove downwards 74. moveDirection.y = v * moveSpeed; 75. } 76. } 77. //now we do the same thing (moreor less) with the horizontal axis, so that we can move sideways. 78. if(h > .1) 79. { 80. //we are pushing to the rightnontrivially 81. moveDirection.x = h * moveSpeed; 82. } 83. else if(h < -.1) 84. { 85. //we are pushing left nontrivially 86. moveDirection.x = h * moveSpeed; 87. //we have these two separateinstead of just comparing Mathf.Abs(h) > .1 in case you want to change theanimation for right vs left 88. //if you don't add anything else,you might as well replace this if else with a single if(Mathf.Abs(h) > .1){moveDirection.x = h * moveSpeed} 89. } 90. //it is actually possible to gethere without triggering any of the above movement conditions. 91. //But if that is the case, then weare on a climbable wall and should not do anything 92. //if you do want to do somethingif we aren't moving, like play a wall idle animation, then let's use: 93. //if(moveDirection ==Vector3.zero) 94. //{ 95. // 96. //} 97. } 98. else 99. { 100. //we are not climbing, so see ifwe are on the ground or in the air 101. if(charController.isGrounded == true) 102. { 103. //if we are grounded, we processinput 104. if(v > .1) 105. { 106. //if we are pushing forward in anontrivial manner 107. if(Input.GetButton("Fire1")) 108. { 109. //if we are pressing the Fire1button, which is apparently the run button 110. animation.CrossFade(animation3); 111. moveSpeed = run; 112. } 113. else 114. { 115. //we are not pressing the runbutton, so just walk (forward) 116. animation[animation2].speed = 1; 117. animation.CrossFade(animation2); 118. moveSpeed = walk; 119. } 120. } 121. else if(v < -.1) 122. { 123. //we are not pushing forward, solook if we are pushing backwards in a nontrivial manner 124. //we don't care about the runbutton, just walk 125. animation[animation2].speed = -1; 126. animation.CrossFade(animation2); 127. moveSpeed = walk; 128. } 129. else 130. { 131. // Plays Idle 132. //we were not pushingsignificantly in either direction 133. animation.CrossFade(animation1); 134. } 135. 136. 137. // Create an animation cycle forwhen the character is turning on the spot 138. //I restructured this collectionof if statements. There wasn't anything wrong with how you had it, but changesI have made necessitated a change 139. //and I think it's prettier thisway. 140. if(Mathf.Abs(v) < .1) 141. { 142. //if we are inside of ourdeadzone: 143. if(h > .1) 144. { 145. animation[animation4].speed = 1; 146. animation.CrossFade(animation4); 147. } 148. // Nota esta a inverter animacaofica melhor uma nova animacao 149. //the above comment means nothingto me :) 150. if(h < -.1) 151. { 152. animation[animation4].speed = -1; 153. animation.CrossFade(animation4); 154. } 155. } 156. //transform.eulerAngles.y +=Input.GetAxis("Horizontal"); 157. //I took out the above linebecause, from the script reference: 158. //Don't increment them, as it willfail when the angle exceeds 360 degrees. Use Transform.Rotate instead. 159. transform.Rotate(0, h ,0); 160. //we rotate around the y axis, butwith less failure when we cross from 360 to 0 161. 162. // Calculate the movementdirection (forward motion) 163. //Let's apply the movement scalarhere instead of after gravity, so that gravity is not effected by it. 164. moveDirection = Vector3(0,0, v * moveSpeed); 165. moveDirection = transform.TransformDirection(moveDirection); 166. 167. //now on to apply gravity (obeygravity, it's the law) 168. } 169. //we just exited the if(grounded)loop, so if we are not grounded, then all we do is apply gravity 170. //and then apply the motion to thecontroller 171. 172. //gravity is here because we onlywant to apply it if we are not climbing, 173. //but we don't care if we aregrounded or not 174. moveDirection.y -= gravity * Time.deltaTime; 175. } 176. //we have just left theif(climbing) else structure, so all possible conditions will execute this next line,as it should be 177. charController.Move(moveDirection * Time.deltaTime); 178. } 179. 180. function OnTriggerEnter(other : Collider) 181. { 182. //check to see what trigger wejust set off. It is possible that we want to use other triggers than just ourwall climbing one 183. //Triggers are useful, after all. 184. //we obviously need to match thetag on the climbable wall triggers to what we have here. 185. if (other.tag == "climbableWall") 186. { 187. //ok, so we hit our climbable walltrigger 188. climbing = true; 189. //we should face the walldirectly, to make sideways movement work properly. 190. //this finds the point on thetrigger that is closest to us and looks at it. 191. transform.LookAt(other.ClosestPointOnBounds(transform.position)); 192. //we will then level it out,leaving only the y rotation. the x shouldn't be necessary, but it doesn't hurt. 193. transform.rotation.eulerAngles.z = 0; 194. transform.rotation.eulerAngles.x = 0; 195. } 196. } 197. 198. function OnTriggerExit(other : Collider) 199. { 200. //again, check which trigger wejust left 201. if(other.tag == "climbableWall") 202. { 203. climbing = false; 204. } 205. }
|