SHOW:
|
|
- or go back to the newest paste.
| 1 | using System.Collections; | |
| 2 | using System.Collections.Generic; | |
| 3 | using UnityEngine; | |
| 4 | ||
| 5 | public class CharacterMovement: MonoBehaviour {
| |
| 6 | ||
| 7 | public float floorOffsetY; | |
| 8 | public float moveSpeed = 6f; | |
| 9 | public float rotateSpeed = 10f; | |
| 10 | ||
| 11 | public string animationFloatname; | |
| 12 | ||
| 13 | Rigidbody rb; | |
| 14 | Animator anim; | |
| 15 | float vertical; | |
| 16 | float horizontal; | |
| 17 | Vector3 moveDirection; | |
| 18 | float inputAmount; | |
| 19 | Vector3 raycastFloorPos; | |
| 20 | Vector3 floorMovement; | |
| 21 | Vector3 gravity; | |
| 22 | Vector3 CombinedRaycast; | |
| 23 | ||
| 24 | // Use this for initialization | |
| 25 | void Start () {
| |
| 26 | rb = GetComponent<Rigidbody>(); | |
| 27 | anim = GetComponent<Animator>(); | |
| 28 | } | |
| 29 | ||
| 30 | private void Update() | |
| 31 | {
| |
| 32 | // reset movement | |
| 33 | moveDirection = Vector3.zero; | |
| 34 | // get vertical and horizontal movement input (controller and WASD/ Arrow Keys) | |
| 35 | vertical = Input.GetAxis("Vertical");
| |
| 36 | horizontal = Input.GetAxis("Horizontal");
| |
| 37 | ||
| 38 | // base movement on camera | |
| 39 | Vector3 correctedVertical = vertical * Camera.main.transform.forward; | |
| 40 | Vector3 correctedHorizontal = horizontal * Camera.main.transform.right; | |
| 41 | ||
| 42 | Vector3 combinedInput = correctedHorizontal + correctedVertical; | |
| 43 | // normalize so diagonal movement isnt twice as fast, clear the Y so your character doesnt try to | |
| 44 | // walk into the floor/ sky when your camera isn't level | |
| 45 | moveDirection = new Vector3((combinedInput).normalized.x, 0, (combinedInput).normalized.z); | |
| 46 | ||
| 47 | // make sure the input doesnt go negative or above 1; | |
| 48 | float inputMagnitude = Mathf.Abs(horizontal) + Mathf.Abs(vertical); | |
| 49 | inputAmount = Mathf.Clamp01(inputMagnitude); | |
| 50 | ||
| 51 | // rotate player to movement direction | |
| 52 | Quaternion rot = Quaternion.LookRotation(moveDirection); | |
| 53 | Quaternion targetRotation = Quaternion.Slerp(transform.rotation, rot, Time.fixedDeltaTime * inputAmount * rotateSpeed); | |
| 54 | transform.rotation = targetRotation; | |
| 55 | ||
| 56 | // handle animation blendtree for walking | |
| 57 | anim.SetFloat(animationFloatname, inputAmount, 0.2f, Time.deltaTime); | |
| 58 | } | |
| 59 | ||
| 60 | ||
| 61 | private void FixedUpdate () {
| |
| 62 | // if not grounded , increase down force | |
| 63 | if(FloorRaycasts(0,0,0.6f) == Vector3.zero) | |
| 64 | {
| |
| 65 | gravity += Vector3.up * Physics.gravity.y * Time.fixedDeltaTime; | |
| 66 | } | |
| 67 | ||
| 68 | // actual movement of the rigidbody + extra down force | |
| 69 | rb.velocity = (moveDirection * moveSpeed * inputAmount) + gravity; | |
| 70 | ||
| 71 | // find the Y position via raycasts | |
| 72 | floorMovement = new Vector3(rb.position.x, FindFloor().y + floorOffsetY, rb.position.z); | |
| 73 | ||
| 74 | // only stick to floor when grounded | |
| 75 | if(FloorRaycasts(0,0, 0.6f) != Vector3.zero && floorMovement != rb.position) | |
| 76 | {
| |
| 77 | // move the rigidbody to the floor | |
| 78 | rb.MovePosition(floorMovement); | |
| 79 | gravity.y = 0; | |
| 80 | } | |
| 81 | ||
| 82 | } | |
| 83 | ||
| 84 | Vector3 FindFloor() | |
| 85 | {
| |
| 86 | // width of raycasts around the centre of your character | |
| 87 | float raycastWidth = 0.25f; | |
| 88 | // check floor on 5 raycasts , get the average when not Vector3.zero | |
| 89 | int floorAverage = 1; | |
| 90 | ||
| 91 | CombinedRaycast = FloorRaycasts(0, 0, 1.6f); | |
| 92 | floorAverage += (getFloorAverage(raycastWidth, 0) + getFloorAverage(-raycastWidth, 0) + getFloorAverage(0, raycastWidth) + getFloorAverage(0, -raycastWidth)); | |
| 93 | ||
| 94 | return CombinedRaycast / floorAverage; | |
| 95 | } | |
| 96 | ||
| 97 | // only add to average floor position if its not Vector3.zero | |
| 98 | int getFloorAverage(float offsetx, float offsetz) | |
| 99 | {
| |
| 100 | ||
| 101 | if (FloorRaycasts(offsetx, offsetz, 1.6f) != Vector3.zero) | |
| 102 | {
| |
| 103 | CombinedRaycast += FloorRaycasts(offsetx, offsetz, 1.6f); | |
| 104 | return 1; | |
| 105 | } | |
| 106 | else { return 0; }
| |
| 107 | } | |
| 108 | ||
| 109 | ||
| 110 | Vector3 FloorRaycasts(float offsetx, float offsetz, float raycastLength) | |
| 111 | {
| |
| 112 | RaycastHit hit; | |
| 113 | // move raycast | |
| 114 | raycastFloorPos = transform.TransformPoint(0 + offsetx, 0 + 0.5f, 0 + offsetz); | |
| 115 | ||
| 116 | Debug.DrawRay(raycastFloorPos, Vector3.down, Color.magenta); | |
| 117 | if (Physics.Raycast(raycastFloorPos, -Vector3.up, out hit, raycastLength)) | |
| 118 | {
| |
| 119 | return hit.point; | |
| 120 | } | |
| 121 | else return Vector3.zero; | |
| 122 | } | |
| 123 | } |