C# 统一对撞机预制件不';我不能在一边工作

C# 统一对撞机预制件不';我不能在一边工作,c#,unity3d,C#,Unity3d,我有一个碰撞器预制件(一个立方体,有一个立方体大小的长方体碰撞器)。在一个场景中,我的播放器与它完美碰撞,但在另一个场景中,播放器出现故障并通过碰撞器的一侧而不是另一侧。旋转它会改变出故障的一侧,因此它始终面向相同的全局方向 这可能是什么原因造成的?我已经确保播放器和碰撞器对象的预设在场景中完全相同,并且除了移动播放器的播放器控制器脚本以及将刚体速度设置为0的OnCollisionExit条件之外,没有任何影响碰撞的因素 在下面添加了代码。输入是操纵手柄(想想直升机上的操纵手柄)。就像我说的,碰

我有一个碰撞器预制件(一个立方体,有一个立方体大小的长方体碰撞器)。在一个场景中,我的播放器与它完美碰撞,但在另一个场景中,播放器出现故障并通过碰撞器的一侧而不是另一侧。旋转它会改变出故障的一侧,因此它始终面向相同的全局方向

这可能是什么原因造成的?我已经确保播放器和碰撞器对象的预设在场景中完全相同,并且除了移动播放器的播放器控制器脚本以及将刚体速度设置为0的OnCollisionExit条件之外,没有任何影响碰撞的因素

在下面添加了代码。输入是操纵手柄(想想直升机上的操纵手柄)。就像我说的,碰撞通常都很完美,但由于某些原因,只有在这个场景中才不会。我怀疑这是某种层次结构或刚体问题,但我似乎已经检查了所有问题

使用UnityEngine;
使用UnityEngine.UI;
公共类控制器:单行为{
公共图书馆;
公共广播电视节目;
公共浮动速度线性=10f;
公共浮子速度角=100f;
公共浮动区=0.5f;
公共浮动旋转偏移=3f;
公共布尔平方移动=假;
公共驾驶模式驾驶模式=驾驶模式。油箱;
[hideininstecpt]
公共布尔=假;
私人刚体;
向量3最后线性定位;
浮动角度位置;
无效开始(){
刚体=GetComponent();
lastLinearPosition=Vector3.0;
lastAngularPosition=0f;
暂停=错误;
}
无效固定更新(){
如果(!暂停){
/*
*输入
*/
如果(驱动模式==驱动模式.油箱){
if(Mathf.Abs(Input.GetAxis(“VerticalLeft”)>joyDeadZone){
向量3旋转点=(transform.position)+transform.TransformDirection(向量3.right)*旋转偏移;
Vector3 rotateAxis=transform.TransformDirection(Vector3.up);
Debug.DrawRay(旋转点,旋转轴*10f,颜色.红色);
transform.RotateAround(rotatePoint,rotateAxis,-speedAngular*Input.GetAxis(“VerticalLeft”)*Time.fixedDelatime*(squaredMovement?Mathf.Abs(Input.GetAxis(“VerticalLeft”):1);
}
if(Mathf.Abs(Input.GetAxis(“VerticalRight”)>joyDeadZone){
向量3旋转点=(transform.position)+transform.TransformDirection(向量3.left)*旋转偏移;
Vector3 rotateAxis=transform.TransformDirection(Vector3.up);
Debug.DrawRay(旋转点,旋转轴*10f,颜色.红色);
transform.RotateAround(rotatePoint,rotateAxis,speedAngular*Input.GetAxis(“VerticalRight”)*Time.FixedDelatime*(squaredMovement?Mathf.Abs(Input.GetAxis(“VerticalRight”):1);
}
}else if(driveMode==DriveModes.Mecanum){
if(Mathf.Abs(Input.GetAxis(“VerticalRight”)>joyDeadZone){
transform.Translate(Vector3.forward*-speedLinear*Input.GetAxis(“VerticalRight”)*Time.fixedDeltaTime*(squaredMovement?Mathf.Abs(Input.GetAxis(“VerticalRight”):1);
}
if(Mathf.Abs(Input.GetAxis(“HorizontalRight”)>joyDeadZone){
transform.Translate(Vector3.right*speedLinear/5f*Input.GetAxis(“HorizontalRight”)*Time.fixedDeltaTime*(squaredMovement?Mathf.Abs(Input.GetAxis(“HorizontalRight”):1);
}
if(Mathf.Abs(Input.GetAxis(“TwistRight”))>joyDeadZone){
transform.Rotate(0,speedAngular*Input.GetAxis(“TwistRight”)*Time.FixedDelatime*(squaredMovement?Mathf.Abs(Input.GetAxis(“TwistRight”):1,0);
}
}
float linearVelocity=Mathf.Round(((transform.position-lastLinearPosition)/Time.fixedDelatime)。震级*100f)/100f;
lastLinearPosition=transform.position;
浮点角度速度=数学圆((transform.eulerAngles.y-lastAngularPosition)/Time.fixedDelatime*Mathf.Deg2Rad*100f)/100f;
lastAngularPosition=transform.eulerAngles.y;
uiController.UpdateVelocities(linearVelocity、angularvocity);
}
}
void OnCollisionExit(碰撞列){
rigidbody.IsKinetic=真;
刚体速度=矢量3.0;
刚体。角速度=矢量3.0;
rigidbody.isKinetic=false;
}
公共枚举驱动模式{
坦克,
麦克纳姆
}
public void setDriveMode(){
int index=PauseCanvas.transform.GetChild(1).GetComponent().value;
如果(索引==0){
驱动模式=驱动模式。油箱;
}else if(索引==1){
driveMode=DriveModes.Mecanum;
}
uiController.UpdateDriveMode(索引==0?“储罐”:“Mecanum”);
}
}

当游戏对象有
刚体和碰撞器,并且您想要碰撞时,不要通过
变换移动对象。平移
或使用
变换旋转它。旋转
变换。旋转
。执行此操作时,将不会发生碰撞

使用
刚体和碰撞移动游戏对象的正确方法是使用函数

正确的旋转方法是使用该功能


例如:

例如:


您需要用这些替换
transform.Translate
transform.Rotate
transform.RotateAround

如何移动此对象?请添加一些代码@程序员添加了代码,这个类控制玩家的移动。我不再使用这些函数,因为它们不能完全按照我所希望的那样工作
using UnityEngine;
using UnityEngine.UI;

public class ChassisController : MonoBehaviour {

    public UIController uiController;

    public Canvas PauseCanvas;

    public float speedLinear = 10f;
    public float speedAngular = 100f;
    public float joyDeadZone = 0.5f;

    public float rotationOffset = 3f;

    public bool squaredMovement = false;

    public DriveModes driveMode = DriveModes.Tank;

    [HideInInspector]
    public bool paused = false;


    private Rigidbody rigidbody;

    Vector3 lastLinearPosition;
    float lastAngularPosition;



    void Start () {

        rigidbody = GetComponent<Rigidbody> ();

        lastLinearPosition = Vector3.zero;
        lastAngularPosition = 0f;
        paused = false;

    }

    void FixedUpdate () {

        if (!paused) {

            /*
         * INPUT
         */

            if (driveMode == DriveModes.Tank) {


                if (Mathf.Abs (Input.GetAxis ("VerticalLeft")) > joyDeadZone) {


                    Vector3 rotatePoint = (transform.position) + transform.TransformDirection (Vector3.right) * rotationOffset;
                    Vector3 rotateAxis = transform.TransformDirection (Vector3.up);

                    Debug.DrawRay (rotatePoint, rotateAxis * 10f, Color.red);

                    transform.RotateAround (rotatePoint, rotateAxis, -speedAngular * Input.GetAxis ("VerticalLeft") * Time.fixedDeltaTime * (squaredMovement ? Mathf.Abs (Input.GetAxis ("VerticalLeft")) : 1));

                }
                if (Mathf.Abs (Input.GetAxis ("VerticalRight")) > joyDeadZone) {
                    Vector3 rotatePoint = (transform.position) + transform.TransformDirection (Vector3.left) * rotationOffset;
                    Vector3 rotateAxis = transform.TransformDirection (Vector3.up);

                    Debug.DrawRay (rotatePoint, rotateAxis * 10f, Color.red);


                    transform.RotateAround (rotatePoint, rotateAxis, speedAngular * Input.GetAxis ("VerticalRight") * Time.fixedDeltaTime * (squaredMovement ? Mathf.Abs (Input.GetAxis ("VerticalRight")) : 1));

                }


            } else if (driveMode == DriveModes.Mecanum) {


                if (Mathf.Abs (Input.GetAxis ("VerticalRight")) > joyDeadZone) {
                    transform.Translate (Vector3.forward * -speedLinear * Input.GetAxis ("VerticalRight") * Time.fixedDeltaTime * (squaredMovement ? Mathf.Abs (Input.GetAxis ("VerticalRight")) : 1));
                }

                if (Mathf.Abs (Input.GetAxis ("HorizontalRight")) > joyDeadZone) {
                    transform.Translate (Vector3.right * speedLinear / 5f * Input.GetAxis ("HorizontalRight") * Time.fixedDeltaTime * (squaredMovement ? Mathf.Abs (Input.GetAxis ("HorizontalRight")) : 1));
                }

                if (Mathf.Abs (Input.GetAxis ("TwistRight")) > joyDeadZone) {
                    transform.Rotate (0, speedAngular * Input.GetAxis ("TwistRight") * Time.fixedDeltaTime * (squaredMovement ? Mathf.Abs (Input.GetAxis ("TwistRight")) : 1), 0);

                }

            }

            float linearVelocity = Mathf.Round (((transform.position - lastLinearPosition) / Time.fixedDeltaTime).magnitude * 100f) / 100f;
            lastLinearPosition = transform.position;

            float angularVelocity = Mathf.Round ((transform.eulerAngles.y - lastAngularPosition) / Time.fixedDeltaTime * Mathf.Deg2Rad  * 100f) / 100f;
            lastAngularPosition = transform.eulerAngles.y;

            uiController.UpdateVelocities (linearVelocity, angularVelocity);


        }
    }

    void OnCollisionExit(Collision col){

        rigidbody.isKinematic = true;

        rigidbody.velocity = Vector3.zero;
        rigidbody.angularVelocity = Vector3.zero;

        rigidbody.isKinematic = false;

    }
    public enum DriveModes{
        Tank,
        Mecanum
    }

    public void setDriveMode(){

        int index = PauseCanvas.transform.GetChild (1).GetComponent<Dropdown> ().value;

        if (index == 0) {
            driveMode = DriveModes.Tank;
        } else if (index == 1) {
            driveMode = DriveModes.Mecanum;
        }

        uiController.UpdateDriveMode (index == 0 ? "Tank" : "Mecanum");
    }
}
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");

Vector3 tempVect = new Vector3(h, 0, v);
tempVect = tempVect.normalized * speed * Time.deltaTime;
rb.MovePosition(transform.position + tempVect);
Quaternion deltaRotation = Quaternion.Euler(eulerAngleVelocity * Time.deltaTime);
rb.MoveRotation(rb.rotation * deltaRotation);