Hello, i’m trying to do a 2.5D plaftormer, for that i’m using only 2d colliders.
I have a player controller script that i copied from a Unity tutorial:
public class PhysicsObject : MonoBehaviour
{
[HideInInspector]
public float minGroundNormalY = .65f;
public float gravedad = 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 += gravedad * 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++)
{
hitBufferList.Add(hitBuffer*);*
}
for (int i = 0; i < hitBufferList.Count; i++)
{
Vector2 currentNormal = hitBufferList*.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*.distance - shellRadius;*
distance = modifiedDistance < distance ? modifiedDistance : distance;
}
}
rb2d.position = rb2d.position + move.normalized * distance;
}
}
The player script:
public class PlayerPlatformerController : PhysicsObject
{
public int playerId;
public float velocidadMax = 7;
public float salto = 7;
private SpriteRenderer spriteRenderer;
private Animator animator;
// Use this for initialization
void Awake()
{
spriteRenderer = GetComponent();
animator = GetComponent();
}
protected override void ComputeVelocity()
{
Vector2 move = Vector2.zero;
move.x = Input.GetAxis(“Horizontal”+playerId);
if (Input.GetButtonDown(“Jump”+playerId) && grounded)
{
velocity.y = salto;
}
/*else if (Input.GetButtonUp(“Jump”))
{
if (velocity.y > 0)
{
velocity.y = velocity.y * 0.5f;
}
}*/
/*bool flipSprite = (spriteRenderer.flipX ? (move.x > 0.01f) : (move.x < 0.01f));
if (flipSprite)
{
spriteRenderer.flipX = !spriteRenderer.flipX;
}*/
if (move.x > 0.02f)
{
spriteRenderer.flipX = false;
}
if(move.x < -0.02f)
{
spriteRenderer.flipX = true;
}
animator.SetBool(“grounded”, grounded);
animator.SetFloat(“velocityX”, Mathf.Abs(velocity.x) / velocidadMax);
animator.SetFloat(“velocityY”, velocity.y);
targetVelocity = move * velocidadMax;
}
}
[105473-screenshot-5.jpg|105473]
[105474-screenshot-3.jpg*|105474]*
*
*
So when i try to pass-trought the platform I can’t, it detects it like a normal collision.
What am i doing wrong?
(This is my first question, sorry if i am breaking some rule)
Thank you for your reply. My fault was at a different spot. I tryed to clamp the Quaternion value from my target rotation and it failed. It actually applied the rotation instead of reading it only. The thing with Time.deltaTime or in my case Time.fixedDeltaTime works as intended when I removed my clamp function. And it should be. Otherwise it applies the rotation in a step = rotateSpeed once per call. in fixedUpdate its still steady, but in your case you can rely on Time.deltaTime for hardware independent rotations in the same speed. I guess its degree per second with delta.
– Elapse