Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- //The following script was sourced from Unity's Platformer tutorial here: https://learn.unity.com/tutorial/live-session-2d-platformer-character-controller
- // The modification is on line 81. it is something that allows the player to jump through platforms instead of hitting their heads on it.
- public class PhysicsObject : MonoBehaviour
- {
- [Header("Physics Object Attributes")]
- public float minGroundNormalY = .65f;
- public float gravityModifier = 1f;
- protected Vector2 targetVelocity;
- protected bool grounded;
- protected Vector2 groundNormal;
- protected Rigidbody2D rb2d;
- protected Vector2 velocity;
- protected ContactFilter2D contactFilter;
- protected RaycastHit2D[] hitBuffer = new RaycastHit2D[16];
- protected List<RaycastHit2D> hitBufferList = new List<RaycastHit2D>(16);
- protected const float minMoveDistance = 0.001f;
- protected const float shellRadius = 0.01f;
- void OnEnable()
- {
- rb2d = GetComponent<Rigidbody2D>();
- }
- void Start()
- {
- contactFilter.useTriggers = false;
- contactFilter.SetLayerMask(Physics2D.GetLayerCollisionMask(gameObject.layer));
- contactFilter.useLayerMask = true;
- }
- void Update()
- {
- targetVelocity = Vector2.zero;
- ComputeVelocity();
- }
- protected virtual void ComputeVelocity()
- {
- }
- void FixedUpdate()
- {
- velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
- velocity.x = targetVelocity.x;
- grounded = false;
- Vector2 deltaPosition = velocity * Time.deltaTime;
- Vector2 moveAlongGround = new Vector2(groundNormal.y, -groundNormal.x);
- Vector2 move = moveAlongGround * deltaPosition.x;
- Movement(move, false);
- move = Vector2.up * deltaPosition.y;
- Movement(move, true);
- }
- void Movement(Vector2 move, bool yMovement)
- {
- float distance = move.magnitude;
- if (distance > minMoveDistance)
- {
- int count = rb2d.Cast(move, contactFilter, hitBuffer, distance + shellRadius);
- hitBufferList.Clear();
- for (int i = 0; i < count; i++)
- {
- PlatformEffector2D platform = hitBuffer[i].collider.GetComponent<PlatformEffector2D>();
- if (!platform || (hitBuffer[i].normal == Vector2.up && velocity.y < 0 && yMovement))
- {
- hitBufferList.Add(hitBuffer[i]);
- }
- }
- for (int i = 0; i < hitBufferList.Count; i++)
- {
- Vector2 currentNormal = hitBufferList[i].normal;
- if (currentNormal.y > minGroundNormalY)
- {
- grounded = true;
- if (yMovement)
- {
- groundNormal = currentNormal;
- currentNormal.x = 0;
- }
- }
- float projection = Vector2.Dot(velocity, currentNormal);
- if (projection < 0)
- {
- velocity = velocity - projection * currentNormal;
- }
- float modifiedDistance = hitBufferList[i].distance - shellRadius;
- distance = modifiedDistance < distance ? modifiedDistance : distance;
- }
- }
- rb2d.position = rb2d.position + move.normalized * distance;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement