我的物体在与墙壁碰撞时开始旋转
My object begins to spin when collides with the wall
我在 Unity 中有一个盒子,后面跟着一个飞机上的相机。我正在尝试处理盒子和不同物体之间的碰撞。当它与不同的东西碰撞时它会旋转,跳跃并发生奇怪的事情。我向 YouTube 上传了一段视频来展示问题。 The video.
我创建了一个 空,里面有相机和盒子。这个空有 刚体 质量 1.
空有脚本组件:
using UnityEngine;
using System.Collections;
public class Character : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log ("Entered OnCollisionEnter function");
if (collision.gameObject.name == "Wall") {
GetComponent<Rigidbody>().velocity = Vector3.zero;
Debug.Log ("Inside if statement");
}
}
}
如您所见,我试图通过编写代码来阻止立方体移动来处理碰撞。
可以帮助你们的其他信息:
盒子
它有一个盒子对撞机。脚本:
using UnityEngine;
using System.Collections;
public class MoveCharacter : MonoBehaviour {
public float deltaMovement = 10f;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
Moving();
}
void Moving()
{
//Moves the character to where it needs.
if (Input.GetKey (KeyCode.A)) {
transform.Translate (new Vector3 (-deltaMovement, 0f, 0f) * Time.deltaTime);
} else if (Input.GetKey (KeyCode.D)){
transform.Translate (new Vector3 (deltaMovement, 0f, 0f) * Time.deltaTime);
}
float yRotation = Camera.main.transform.eulerAngles.y;
float movementX = Mathf.Sin ((yRotation * Mathf.PI) / 180) * deltaMovement;
float movementZ = Mathf.Cos ((yRotation * Mathf.PI) / 180) * deltaMovement;
if (Input.GetKey (KeyCode.W)) {
transform.Translate (new Vector3 (movementX, 0f, movementZ) * Time.deltaTime, Space.World);
} else if (Input.GetKey (KeyCode.S)){
transform.Translate (new Vector3 (-movementX, 0f, -movementZ) * Time.deltaTime, Space.World);
}
}
}
墙
这是一个带有网格对撞机的平面,有或没有刚体没有区别,同样的问题...
有什么帮助吗?
如果您使用的是物理学,则不应通过更改平移来移动对象,而应通过向对象施加力或至少为其添加速度来移动对象。这将使物理引擎能够正确计算与其他刚体的反应。
如果你移动一个物体,我调整它的平移,那么当发生碰撞时,就好像这个物体已经实体化到引擎的另一个物体中,因为它会以没有速度等的方式移动,你会变得很奇怪行为。
我在 Unity 中有一个盒子,后面跟着一个飞机上的相机。我正在尝试处理盒子和不同物体之间的碰撞。当它与不同的东西碰撞时它会旋转,跳跃并发生奇怪的事情。我向 YouTube 上传了一段视频来展示问题。 The video.
我创建了一个 空,里面有相机和盒子。这个空有 刚体 质量 1.
空有脚本组件:
using UnityEngine;
using System.Collections;
public class Character : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log ("Entered OnCollisionEnter function");
if (collision.gameObject.name == "Wall") {
GetComponent<Rigidbody>().velocity = Vector3.zero;
Debug.Log ("Inside if statement");
}
}
}
如您所见,我试图通过编写代码来阻止立方体移动来处理碰撞。
可以帮助你们的其他信息:
盒子
它有一个盒子对撞机。脚本:
using UnityEngine;
using System.Collections;
public class MoveCharacter : MonoBehaviour {
public float deltaMovement = 10f;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
Moving();
}
void Moving()
{
//Moves the character to where it needs.
if (Input.GetKey (KeyCode.A)) {
transform.Translate (new Vector3 (-deltaMovement, 0f, 0f) * Time.deltaTime);
} else if (Input.GetKey (KeyCode.D)){
transform.Translate (new Vector3 (deltaMovement, 0f, 0f) * Time.deltaTime);
}
float yRotation = Camera.main.transform.eulerAngles.y;
float movementX = Mathf.Sin ((yRotation * Mathf.PI) / 180) * deltaMovement;
float movementZ = Mathf.Cos ((yRotation * Mathf.PI) / 180) * deltaMovement;
if (Input.GetKey (KeyCode.W)) {
transform.Translate (new Vector3 (movementX, 0f, movementZ) * Time.deltaTime, Space.World);
} else if (Input.GetKey (KeyCode.S)){
transform.Translate (new Vector3 (-movementX, 0f, -movementZ) * Time.deltaTime, Space.World);
}
}
}
墙
这是一个带有网格对撞机的平面,有或没有刚体没有区别,同样的问题...
有什么帮助吗?
如果您使用的是物理学,则不应通过更改平移来移动对象,而应通过向对象施加力或至少为其添加速度来移动对象。这将使物理引擎能够正确计算与其他刚体的反应。
如果你移动一个物体,我调整它的平移,那么当发生碰撞时,就好像这个物体已经实体化到引擎的另一个物体中,因为它会以没有速度等的方式移动,你会变得很奇怪行为。