zl856012
新手
新手
  • UID2416
  • 粉丝0
  • 关注0
  • 发帖数8
阅读:423回复:2

关于模型碰撞穿透的问题

楼主#
更多 发布于:2016-10-21 11:56
请问,在一个桌子有很多物体,我可以拖动每个物体。用transform的话,会穿透桌子,加了碰撞和刚体也会穿透,用刚体的话物体会弹出去。
请问   怎么实现无论我拖动物体,物体也不会穿透,也不会弹飞,而是会安稳的落在桌子上啊

欢迎分享

zl856012
新手
新手
  • UID2416
  • 粉丝0
  • 关注0
  • 发帖数8
沙发#
发布于:2016-11-03 09:59
挂在物体上,不移动的物体是Board层,移动的物体是不同层。


using UnityEngine;
using System.Collections;


public class Move : MonoBehaviour {


    int layerMask;// 可摆放物体的层
    float distance;// 射线检测距离
    // Use this for initialization
    void Start()
    {
        layerMask = LayerMask.GetMask("Board");
        distance = 100f;
 //StartCoroutine (OnMouseDown ());




    }




 void Update()
 {


 }


 IEnumerator OnMouseDown()
    {
        Rigidbody rb = GetComponent<Rigidbody>();


        rb.useGravity = false;


        // 将物体由世界坐标系转化为屏幕坐标系,以用来明确屏幕坐标系Z轴的位置  
        Vector3 screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        // 计算物体位置和鼠标位置的距离(鼠标位置需要转换为世界坐标)
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
        // Z 坐标的偏移量        
        float zOffset = 0;
        // 使用射线检测目标位置,目的是为了获取目标的 Z 坐标            
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, distance, layerMask))
        {
            // 因按下鼠标按钮后,射线检测到的 Z 坐标会和物体的 Z坐标有偏差,所以使用 zOffset记录初始偏差
            zOffset = screenPoint.z - Camera.main.WorldToScreenPoint(hit.point).z;
 Debug.Log (zOffset);
        }
        //当鼠标左键按下时  
        while (Input.GetMouseButton(0))
        {
            // 使用射线检测目标位置,目的是为了获取目标的 Z 坐标            
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 100, LayerMask.GetMask("Board")))
            {
                screenPoint = Camera.main.WorldToScreenPoint(hit.point);
            }
            // 得到现在鼠标的2维屏幕坐标,并使用射线检测的目标 Z 坐标,并且要加上原始的偏差 zOffset
            Vector3 point = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z + zOffset);
            // 转换为世界坐标
            Vector3 pos = Camera.main.ScreenToWorldPoint(point);
            // 加上偏移量
            pos = pos + offset;
            // 移动物体
            rb.MovePosition(pos);


            yield return new WaitForFixedUpdate();
        }
        rb.useGravity = false;
    }




}
zl856012
新手
新手
  • UID2416
  • 粉丝0
  • 关注0
  • 发帖数8
板凳#
发布于:2016-11-03 10:02
请问有没有更好的想法,可以挂在Cam上,选择每个点击的物体,不会穿透和弹飞啊
游客

返回顶部