大家好,我的玩家正在石头上穿过石头。名为Champ的玩家有一个长方体对撞机,石头有一个网格对撞机。玩家也有刚体。我尝试了所有我发现的东西,但没有任何东西能帮我解决问题。
MovePlayer.cs脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovePlayer : MonoBehaviour
{
Rigidbody rb;
public float speed = 10f;
private Vector3 moveDirection;
public float rotationSpeed = 0.05f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
moveDirection = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).normalized;
}
void FixedUpdate()
{
rb.MovePosition(rb.position + transform.TransformDirection(moveDirection * speed * Time.deltaTime));
RotatePlayer();
}
void RotatePlayer()
{
if (moveDirection != Vector3.zero)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);
}
transform.Translate(moveDirection * speed * Time.deltaTime, Space.World);
}
}
检查员中的播放器设置
检查员中的石头设置
场景预览
谢谢大家的帮助!:(
所以伙计们,我在上面发布的家伙的帮助下找到了解决方案。
问题是我的玩家速度在代码中太高了——速度在浮动10上,但我在玩家的Unity Inspector中将速度改为浮动50。
所以我解决这个问题的第一步是把速度降到10,但我仍然想以50f的速度移动。。。
这个问题的解决方案是,在Unity 2020.3.24f1及更高版本(可能更低(中,您可以转到编辑>项目设置>Physics并设置">默认最大穿透速度";达到你希望物体停止而不通过的速度。在我的情况下,我想以速度=50f移动,所以我需要将默认最大穿透速度更改为50。
我希望我将来能帮助别人这个答案!
祝福最大G.
测试了您的代码,冲突似乎在我这边工作得很好。
通过将脚本添加到带有长方体碰撞器的GameObject中并使用立方体创建一个小级别来测试它。还做了一个墙,我修改为使用网格碰撞器而不是长方体碰撞器。玩家与场景中的物体正常碰撞。
您应该仔细检查ProjectSettings > Physics
中的层碰撞矩阵,是否已将层播放器和墙设置为碰撞。
- 你也可以尝试在场景中添加新的立方体,并将其层设置为墙,看看玩家是否与它碰撞。如果碰撞了,那么石头的网格可能会出现问题
- 如果没有,我会从播放器中禁用动画师和重力体组件,以确保它们不会干扰碰撞
Rigidbody.MovePosition
基本上让玩家进行传送,这会导致意想不到的行为。通常建议使用Rigidbody.AddForce
。为了精确移动,可以使用CCD_ 4。
public float maxVelocityChange = 5.0f;
void moveUsingForces(){
Vector3 targetVelocity = moveDirection;
// Doesn't work with the given RotatePlayer implementation.
// targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
Vector3 velocity = rb.velocity;
Vector3 velocityChange = (targetVelocity - velocity);
velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
velocityChange.y = 0;
rb.AddForce(velocityChange, ForceMode.VelocityChange);
}
在这段代码中,您已经应用了两次motion,问题是使用了transform.Translate
。请记住,Rigidbody
类方法对碰撞器很敏感,可以识别它们,但变换不同,只应用点对点移位。为了解决这个问题,我认为您不需要在旋转部分使用translate
的重复运动代码。
void RotatePlayer()
{
if (moveDirection != Vector3.zero)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);
}
// removed translate
}