C# 为什么会出现这种奇怪的抖动?

C# 为什么会出现这种奇怪的抖动?,c#,unity3d,position,game-physics,rigid-bodies,C#,Unity3d,Position,Game Physics,Rigid Bodies,我有一个场景,在这个场景中,玩家可以拾起和放下物体,也可以移动和环顾四周 所有玩家对象都是空游戏对象“主要角色”的子对象: 我捡起的物体会放在我手上的位置,但是在我的胶囊与任何墙壁碰撞后,会有一种奇怪的抖动,我不知道如何修复 下面是.exe文件: 这是数据文件夹: 以下是脚本: 拾取和放下脚本: public bool handsFull = false; public float distanceMax = 20f; public Transform handPositio

我有一个场景,在这个场景中,玩家可以拾起和放下物体,也可以移动和环顾四周

所有玩家对象都是空游戏对象“主要角色”的子对象:

我捡起的物体会放在我手上的位置,但是在我的胶囊与任何墙壁碰撞后,会有一种奇怪的抖动,我不知道如何修复

下面是.exe文件: 这是数据文件夹:

以下是脚本:

拾取和放下脚本:

public bool handsFull = false;

    public float distanceMax = 20f;

    public Transform handPosition;

    public LayerMask canPickUp;

    public GameObject taggedGameObject;

    public bool colliderTriggered;

    public bool bounds;

    public PickedUpObject pickedUpScript;

    public Rigidbody player;

    // Use this for initialization
    void Start () {

        print(FindClosestPickup().name);
        handPosition = transform;
        pickedUpScript = null;

    }

    // Update is called once per frame
    void Update () {


                if (Input.GetKeyDown (KeyCode.E) && !bounds) {
                        if (Physics.CheckSphere (handPosition.position, 2f, canPickUp)) {

                                if (handsFull) {
                                        Drop ();
                                }

                                if (!handsFull) {
                                        PickedUp ();
                                }

                handsFull = !handsFull;

                        }
                }

                if (handsFull) {
                        RotateMovePickedUpObject();
                }   


        }



    private void PickedUp(){

        //Closest object to top of list
        taggedGameObject = (GameObject)FindClosestPickup();

        taggedGameObject.collider.isTrigger = true;



        taggedGameObject.rigidbody.useGravity = false;
        taggedGameObject.rigidbody.isKinematic = true;

        pickedUpScript = taggedGameObject.GetComponent<PickedUpObject> ();

        Debug.Log ("Pick Up");


    }

    private void RotateMovePickedUpObject(){

        //Rotate

        if(Input.GetKeyDown(KeyCode.End)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(0, 0, 45);
        }
        if(Input.GetKeyDown(KeyCode.Delete)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(0, 45, 0);
        }
        if(Input.GetKeyDown(KeyCode.PageDown)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(0, -45, 0);
        }
        if(Input.GetKeyDown(KeyCode.Home)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(0, 0, -45);
        }
        if(Input.GetKeyDown(KeyCode.PageUp)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(-45, 0, 0);
        }
        if(Input.GetKeyDown(KeyCode.Insert)){
            taggedGameObject.transform.localRotation *= Quaternion.Euler(45, 0, 0);
        }

        taggedGameObject.transform.position = Vector3.Lerp(taggedGameObject.transform.position, handPosition.position, (1 - Mathf.Exp( -20 * Time.smoothDeltaTime )) * 10);

    }


    private void Drop(){

        taggedGameObject.collider.isTrigger = false;

        taggedGameObject.rigidbody.useGravity = true;
        taggedGameObject.rigidbody.isKinematic = false;

        taggedGameObject = null;

        Debug.Log ("Drop");

        pickedUpScript = null;

    }

    private GameObject FindClosestPickup() {

        //Find closest gameobject with tag
        GameObject[] gos;
        gos = GameObject.FindGameObjectsWithTag("pickup");
        GameObject closest = null;
        float distance = Mathf.Infinity;
        Vector3 position = transform.position;

        foreach (GameObject go in gos) {
            Vector3 diff = go.transform.position - position;
            float curDistance = diff.sqrMagnitude;
            if (curDistance < distance) {
                closest = go;
                distance = curDistance;
            }
        }

        return closest;
    }

}
这条线将使对象不断向手的位置移动。如果将刚体连接到要移动的游戏对象,则在物理计算期间作用于该对象的物理将与更新功能期间手动移动对象相冲突

这取决于当冲突发生时您希望发生什么,以及解决方案。如果您只是想停止“抖动”,并且仍然能够将对象与其他物理对象保持在一起,那么请使用此选项

taggedGameObject.rigidbody.AddForce( ( taggedGameObject.transform.position - handPosition.position ) * force );

这将保持与刚体的所有交互。您必须调整移动对象的力,并且可能在玩家手中禁用标记的游戏对象上的重力。但是它应该有预期的效果。

我还没有调试您的代码,但是我注意到您有一个方法
GameObject FindClosestPickup()
。如果有多个相同接近的对象,则该方法返回的对象可能由于以下原因而不稳定。这种不稳定性可能导致触发器,因为该方法在每次游戏更新时返回不同的对象。这里可能是这种情况吗?我怀疑这是原因,我的物体彼此相距很远,而且只有一个物体仍然会发生抖动,但感谢您以后的警告!你好谢谢你的帮助,大部分剧本都很好用!(我不得不将计算反向到(handPosition.position-taggedGameObject.transform.position))我临时解决了弹簧接头的问题,但是这个修复方法让我能够以更有效的方式修复问题!再次感谢!
public PickUpDrop pickUpScript;
    public GameObject thisOne;
    public Color thecolor;
    public bool inObject;

    // Use this for initialization
    void Start () {
        thisOne = this.gameObject;
    }

    // Update is called once per frame
    void Update () 
    {
        thecolor = thisOne.renderer.material.color;

    if (pickUpScript.taggedGameObject != thisOne)
        {
            gameObject.renderer.material.color = Color.gray;
        }

    if (pickUpScript.taggedGameObject == thisOne)
        {
            Color color = renderer.material.color;
            color.a = 0.5f;
            renderer.material.color = color;
        }
    }

    void OnTriggerEnter ()
    {
        if (thisOne == pickUpScript.taggedGameObject)
        {
            inObject = true;
            pickUpScript.bounds = true;
            gameObject.renderer.material.color = Color.red;

        }
    }

    void OnTriggerExit()
    {
        if(thisOne == pickUpScript.taggedGameObject)
        {
            inObject = false;
            pickUpScript.bounds = false;
            gameObject.renderer.material.color = Color.gray;        
        }
    }

}
taggedGameObject.transform.position = Vector3.Lerp(taggedGameObject.transform.position, handPosition.position, (1 - Mathf.Exp( -20 * Time.smoothDeltaTime )) * 10);
taggedGameObject.rigidbody.AddForce( ( taggedGameObject.transform.position - handPosition.position ) * force );