Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class movement : MonoBehaviour
- {
- [SerializeField]
- private float fallMultiplier = 3f;
- [SerializeField]
- private float lowJumpMultiplier = 2f;
- [SerializeField]
- private float gravityScale = 1f;
- [SerializeField]
- private float speed = 5f;
- Rigidbody PlayerRB;
- [Range(1,10)]
- private float jumpVelocity;
- [SerializeField]
- private float cooldown;
- //groundcheck, I hope
- [SerializeField] LayerMask groundMask;
- List<Collider> groundTouchPoints = new List<Collider>();
- void OnCollisionStay(Collision collision)
- {
- List<ContactPoint> contactPoints = new List<ContactPoint>();
- int numberOfContacts = collision.GetContacts(contactPoints);
- for (int i = 0; i < numberOfContacts; i++)
- {
- Collider collider = collision.collider;
- if (RoundedNormalVectorAngle(contactPoints[i].normal,3) <= 45 && CompareLayerIndex(collision.transform, groundMask) && !groundTouchPoints.Contains(collider))
- {
- groundTouchPoints.Add(collider);
- }
- else if (!IsStillTouchingGround(contactPoints,numberOfContacts) && groundTouchPoints.Contains(collider))
- {
- groundTouchPoints.Remove(collider);
- }
- }
- }
- void OnCollisionExit(Collision collision)
- {
- Collider collider = collision.collider;
- if (groundTouchPoints.Contains(collider))
- {
- groundTouchPoints.Remove(collider);
- }
- }
- private void Start()
- {
- PlayerRB = GetComponent<Rigidbody>();
- jumpVelocity = 10;
- }
- // Update is called once per frame
- void FixedUpdate()
- {
- //sprint
- if (Input.GetKey(KeyCode.LeftShift))
- {
- speed = 10f;
- }
- else
- {
- speed = 5f;
- }
- //movement
- float xMov = Input.GetAxisRaw("Horizontal");
- float zMov = Input.GetAxisRaw("Vertical");
- PlayerRB.velocity = new Vector3(xMov * speed, PlayerRB.velocity.y, zMov * speed);
- }
- private void Update()
- {
- //jump
- if (Input.GetKeyDown(KeyCode.Space) && groundTouchPoints.Count > 0)
- {
- PlayerRB.velocity = Vector3.up * jumpVelocity;
- }
- //fall
- if (PlayerRB.velocity.y < 0)
- {
- PlayerRB.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
- }
- else if(PlayerRB.velocity.y > 0 && !Input.GetKey(KeyCode.Space))
- {
- PlayerRB.velocity += Vector3.up * Physics.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
- }
- }
- float RoundedNormalVectorAngle(Vector3 normal, uint decimalAccuracy)
- {
- int accuracy = (int)Mathf.Pow(10, decimalAccuracy);
- return Mathf.RoundToInt(Vector3.Angle(normal, Vector3.up)*accuracy)/accuracy;
- }
- bool CompareLayerIndex(Transform transform, LayerMask layer)
- {
- return Mathf.Pow(2, transform.gameObject.layer) == layer;
- }
- bool IsStillTouchingGround(List<ContactPoint> contactPoints,int numberOfContacts)
- {
- for(int i = 0; i < numberOfContacts; i++)
- {
- if (RoundedNormalVectorAngle(contactPoints[i].normal, 3) <= 45)
- {
- return true;
- }
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement