拖放和触发器

时间:2017-04-22 14:58:00

标签: c# unity3d unity5

我正在尝试创建拖放功能。我有一个位于立方体上的游戏对象(如桌子)。我想让玩家将这个对象拖放到多个“热点”。同时,虽然这是一个3D游戏,但不应该允许它们将对象拖离桌面,上方,下方,等等。只需拖动桌面顶部即可。我有这种设置的方式是这样的:

  1. 在桌面上(一个有刚体的立方体)我有两架飞机。这个平面只是装饰性的,让用户可以看到放到哪里。这些平面中的每一个都有一个子平面(一个小得多的区域,以父母为中心)。这个孩子有一个Box Collider(isTrigger = true),它向上延伸到空中,就像一根伸出地面的杆子一样)

  2. 然后我有一个立方体,它有一个刚体和一个盒子对撞机(isTrigger = true)。这个立方体被实例化到一个热点上的“桌子”顶部。

  3. HotSpotCode.cs

    public class HotSpotCodeScript : MonoBehaviour {      
    
        public void OnTriggerEnter(Collider other){
            DraggableObject ds = other.GetComponent<DraggableObject>();        
            ds.startPos = this.gameObject.transform.position;   
    
        }
    }
    

    DraggableObject.cs

    public class DraggableObject : MonoBehaviour {       
        float lerpTime = 1f;
        float currentLerpTime;
        float moveDistance = 10f;
        Plane plane;    
        public Vector3 startPos, endPos;
        public bool drag;
        Vector3 position;
    
        void Start(){
            startPos = transform.position;
            endPos = transform.position + transform.up * moveDistance;
        }
        void OnMouseDown(){    
            plane = new Plane(Vector2.up, transform.position);
            drag = true; // start dragging
        }
        void OnMouseUp(){
            lerp();
            drag = false;
        }   
        private void lerp() {       
            currentLerpTime += Time.deltaTime;
            if (currentLerpTime > lerpTime)
            {
                currentLerpTime = lerpTime;
            }
    
            float perc = currentLerpTime / lerpTime;
            transform.position = Vector3.Lerp(startPos, endPos, perc);
        }
        public void Update()
        {
            position = transform.localPosition;
            if (drag)
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                float distance;
    
                if (plane.Raycast(ray, out distance))
                {                
                    transform.position = ray.GetPoint(distance);
                }
            }
        }
        public void OnTriggerEnter(Collider other){
           endPos = other.transform.position;
        }
    }
    

    这段代码大部分都有效。我可以拖动物体,它不会离开它所居住的计划,短距离。但是,我拖动对象越远,然后释放它,对象就越不会重新回到原来的起始位置,并且会被困在某个地方。我不确定这是Lerp()函数的问题,还是可能是如何创建它所拖动的平面。谁能帮我吗?如果您需要更多信息,请告诉我。我已经在这方面工作了好几个星期,而且还没有进一步说明这一点。

    另一个弹出的问题是,当被拖动的物体被释放并与热点的对撞机接触时,它会使物体停在准确的位置。因此,如果立方体的一角与对撞机接触,立方体将不会以热点为中心停留。

0 个答案:

没有答案