【问题标题】:Bug with my object un-snapping objects in Unity我的对象在 Unity 中取消捕捉对象的错误
【发布时间】:2019-03-06 07:38:00
【问题描述】:

我在测试场景中有基本的对象捕捉,但是当我取消捕捉对象时,捕捉的对象将重新捕捉,除非我很快将其移开。 对于场景设置的上下文,我想在 VR 中实现捕捉对象,因此我在要移动的对象内有一个较小的父对象,以表示该对象将在 VR 中作为父对象的手。此外,我将捕捉脚本(下面的第一个)附加到“手”对象,并在手上使用触发对撞机和它附加到的方形 obj。

有什么办法可以解决这个问题,这样我就不需要快速拉动来解耦对象了吗?

Video of the bug happening

下面是我用来实现这个的脚本

    public class snap : MonoBehaviour, collider_helper.collider_help_reciever
{
    public Transform snapObj;
    public Transform SnapTarget;
    bool snapped = false;

    // Use this for initialization
    void Start () {

    }

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

    }

    public void OnTriggerEnter (Collider other)
    {
        Debug.Log("enter");
        if (snapped == false && other.transform.GetInstanceID() == SnapTarget.GetInstanceID())
        {
            snapObj.position = SnapTarget.position;
            snapObj.rotation = SnapTarget.rotation;
            snapObj.parent = SnapTarget;
            snapped = true;
        }
    }
    public void OnTriggerExit(Collider other)
    {

        Debug.Log("exit");
        if (snapped == true && other.transform.GetInstanceID() == SnapTarget.GetInstanceID())
        {
            snapObj.position = transform.position;
            snapObj.rotation = transform.rotation;
            snapObj.parent = transform;
            snapped = false;
            StartCoroutine(noSnap);
        }
    }
}

    public class collider_helper : MonoBehaviour {
    public GameObject recieving;
    collider_help_reciever reciever;
    // Use this for initialization
    void Start () {
        reciever = recieving.GetComponent<collider_help_reciever>();
    }

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

    }

    void OnTriggerStay (Collider other)
    {
        reciever.OnTriggerEnter(other);
    }
    public interface collider_help_reciever
    {
        void OnTriggerEnter(Collider other);
    }

}

【问题讨论】:

    标签: c# unity3d scripting


    【解决方案1】:

    答案是添加一个浮点数 (lastSnapTime) 来存储对象上次解耦的时间,并且仅在自上次解耦后经过一段时间后才允许发生捕捉:

        public void OnTriggerEnter(Collider other)
    {
        Debug.Log("enter");
        if (other.transform.GetInstanceID() == SnapTarget.GetInstanceID())
        {
            if (lastSnapTime + 0.1f < Time.time)
            {
                snapObj.position = SnapTarget.position;
                snapObj.rotation = SnapTarget.rotation;
                snapObj.parent = SnapTarget;
            }
        }
    }
    public void OnTriggerExit(Collider other)
    {
    
        Debug.Log("exit");
        if (other.transform.GetInstanceID() == SnapTarget.GetInstanceID())
        {
            lastSnapTime = Time.time;
            snapObj.position = transform.position;
            snapObj.rotation = transform.rotation;
            snapObj.parent = transform;
            //StartCoroutine(noSnap);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2012-12-07
      • 1970-01-01
      • 2019-06-03
      • 2018-01-06
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多