【发布时间】:2021-06-24 06:26:17
【问题描述】:
所以我试图做一个瓦片基础运动,突然遇到了 collider2D 的这个问题。 所以我在图像中为那个极点设置了一个平铺大小的 2D 对撞机,但是出现了一个问题。 我突然注意到我无法通过或在 2D 碰撞器下方的一个图块/块上移动。
请注意,角色没有任何 2d 碰撞器或 2d 刚体。
角色依靠函数private bool notBlocked(Vector3 movePosition) 来阻止我的角色移动并在被阻止时停止动画。
我突出显示了我无法移动的块/图块。那里没有对撞机,所以我不知道为什么我的角色不能穿过/在上面
但是当我在碰撞器顶部的块上尝试它时,它的工作原理与碰撞器周围的左右瓷砖/块相同。
所以这是我在碰撞时用于移动和停止移动的代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private float moveSpeed;
public LayerMask SolidObjectLayer;
private bool isMoving;
private Vector2 input;
private Animator animator;
private void Update()
{
InputMove();
}
private void Awake()
{
animator = GetComponent<Animator>();
}
private void InputMove()
{
if (!isMoving)
{
input.x = Input.GetAxisRaw("Horizontal");
input.y = Input.GetAxisRaw("Vertical");
if (input.x != 0) input.y = 0;
if (input != Vector2.zero)
{
animator.SetFloat("Horizontal", input.x);
animator.SetFloat("Vertical", input.y);
var movePos = transform.position;
movePos.x += input.x;
movePos.y += input.y;
if (notBlocked(movePos))
StartCoroutine(Move(movePos));
}
}
if (Input.GetKey(KeyCode.LeftShift))
{
moveSpeed = 6f;
animator.speed = 1.5f;
}
else
{
moveSpeed = 4f;
animator.speed = 1f;
}
animator.SetBool("isMoving", isMoving);
}
IEnumerator Move(Vector3 movePos)
{
isMoving = true;
while((movePos - transform.position).sqrMagnitude > Mathf.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, movePos, moveSpeed * Time.deltaTime);
yield return null;
}
transform.position = movePos;
isMoving = false;
}
private bool notBlocked(Vector3 movePosition)
{
if(Physics2D.OverlapCircle(movePosition, 0.2f, SolidObjectLayer) != null)
{
return false;
}
return true;
}
}
我不知道它是否与“private bool isBlocked()”有关,但它是我用来阻止角色在被阻止时进一步移动的函数。
【问题讨论】:
-
你的角色对撞机有多大?看起来头部正在与柱子相撞
-
我的角色上没有碰撞器。它使用
OverlapCircle阻止角色移动穿过具有 2D 对撞机的对象