碰撞统一后角色错误动作
Character wrong action after collision unity
我有一个角色(用键盘的箭头移动)。我家有好几堵墙。
问题是,我想在撞墙时检测碰撞(这样它就不会通过)。没关系。但是现在,当我的角色撞墙时,他会做一些奇怪的事情,他会像在重力模式下一样独自移动(我不知道是否可以理解)。
所以,我想,当我撞到墙上时,角色会停止移动吗?我已经尝试了很多东西,但我有点迷路了,所以如果你有任何想法,我会接受并尝试!仅作记录,几个月前开始使用 unity,所以我的脚本中可能存在错误(我的意思是,它编译但可能不是最好的编写方式)。
这是我的脚本:
public class ScriptCharacter : MonoBehaviour
{
private Animator m_animator;
private Rigidbody m_rigidBody;
private void Start()
{
m_animator = gameObject.GetComponent<Animator>();
m_animator.SetFloat("Speed", 1);
}
// Update is called once per frame
private void FixedUpdate()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
transform.Translate(transform.forward * v * Time.deltaTime, Space.World);
transform.Rotate(0, h * Time.deltaTime * 30, 0);
m_animator.SetFloat("Speed", v);
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("here");
if (collision.gameObject.name == "Wall")
{
m_rigidBody.velocity = Vector3.zero;
m_rigidBody.angularVelocity = Vector3.zero;
m_animator.SetFloat("Speed", 0);
}
}
}
正如 Chestera 在评论中提到的:
在 onCollisionEnter()
中将刚体设置为运动学并在 onCollisionExit()
中将其设置回动态。
来自 Unity 文档,"If isKinematic is enabled, Forces, collisions or joints will not affect the rigidbody anymore."
https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html
我有一个角色(用键盘的箭头移动)。我家有好几堵墙。
问题是,我想在撞墙时检测碰撞(这样它就不会通过)。没关系。但是现在,当我的角色撞墙时,他会做一些奇怪的事情,他会像在重力模式下一样独自移动(我不知道是否可以理解)。
所以,我想,当我撞到墙上时,角色会停止移动吗?我已经尝试了很多东西,但我有点迷路了,所以如果你有任何想法,我会接受并尝试!仅作记录,几个月前开始使用 unity,所以我的脚本中可能存在错误(我的意思是,它编译但可能不是最好的编写方式)。
这是我的脚本:
public class ScriptCharacter : MonoBehaviour
{
private Animator m_animator;
private Rigidbody m_rigidBody;
private void Start()
{
m_animator = gameObject.GetComponent<Animator>();
m_animator.SetFloat("Speed", 1);
}
// Update is called once per frame
private void FixedUpdate()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
transform.Translate(transform.forward * v * Time.deltaTime, Space.World);
transform.Rotate(0, h * Time.deltaTime * 30, 0);
m_animator.SetFloat("Speed", v);
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("here");
if (collision.gameObject.name == "Wall")
{
m_rigidBody.velocity = Vector3.zero;
m_rigidBody.angularVelocity = Vector3.zero;
m_animator.SetFloat("Speed", 0);
}
}
}
正如 Chestera 在评论中提到的:
在 onCollisionEnter()
中将刚体设置为运动学并在 onCollisionExit()
中将其设置回动态。
来自 Unity 文档,"If isKinematic is enabled, Forces, collisions or joints will not affect the rigidbody anymore."
https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html