使用角色控制器时,角色不会与游戏对象碰撞



我正在创建一个跑步游戏,你有一个向前跑的角色,你必须躲避障碍。然而,我的角色并没有与任何东西发生冲突,只是穿过了它们。

这是我控制角色移动的代码(向前移动是自动完成的,玩家控制侧向移动(:


public class CharacterControllertest : MonoBehaviour
{
public float sidewaysSpeed = 5.0f;
public float forwardSpeed = 50.0f;
Vector3 target;
private void Start()
{
SetNewTarget(new Vector3(
transform.position.x,
transform.position.y,
transform.position.z + 10
));
}
// Update is called once per frame
void Update()
{
Vector3 direction = target - transform.position;
transform.Translate(direction.normalized * forwardSpeed * Time.deltaTime, Space.World);
SetNewTarget(new Vector3(
transform.position.x,
transform.position.y,
transform.position.z + 10
)); ;
float translation = Input.GetAxis("Horizontal") * sidewaysSpeed;
translation *= Time.deltaTime;
transform.Translate(translation, 0, 0);
}
void SetNewTarget(Vector3 newTarget)
{
target = newTarget;
transform.LookAt(target);
}
} ```

你的播放器可能不会与任何东西发生碰撞的原因之一是上面没有碰撞器。如果你添加了合适的碰撞器或网格碰撞器,你应该开始发生碰撞。另一个原因是你试图站在上面的东西上没有对撞机。试着在你的物体上添加对撞机,你应该很好!:(

无论何时涉及物理,您都不希望在Update中使用Transform移动任何东西。这会导致不自然的移动,并破坏物理和碰撞检测。

如果您使用的是CharacterController,则实际使用它,而不是Translate使用CharacterController.Move

CharacterController不受力的影响,只有在调用move函数时才会移动。然后,它将执行移动,但受到碰撞的约束。

所以像这样的东西

// Reference via the Inspector
[SerializeField] private CharacterController _characterController;
private void Awake ()
{
// Or as fallback get once
if(!_characterController) _characterController = GetComponent<CharacterController>();
}
private void Update ()
{
var direction = (target - transform.position).normalized;
_characterController.Move(direction * forwardSpeed * Time.deltaTime);
SetNewTarget(transform.position + Vector3.forward * 10);
var horizontal = Input.GetAxis("Horizontal") * sidewaysSpeed * Time.deltaTime;
_characterController.Move(Vector3.right * horizontal);
}

最新更新