View difference between Paste ID: b4Urwmjm and sW9ucpnn
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
}