Unity3D 鼠标拖动3维物体与系统自带拖动刚体物体

来源:互联网 发布:艾默生网络被收购 编辑:程序博客网 时间:2024/05/21 18:48

using UnityEngine;
using System.Collections;


public class MouseControl : MonoBehaviour {


    IEnumerator OnMouseDown()
    {


        var camera = Camera.mainCamera;
        if (camera)
        {
            //转换对象到当前屏幕位置
            Vector3 screenPosition = camera.WorldToScreenPoint(transform.position);


            //鼠标屏幕坐标
            Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
            //获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
            Vector3 offset = transform.position - camera.ScreenToWorldPoint(mScreenPosition);
            print("drag starting:" + transform.name);


            //若鼠标左键一直按着则循环继续
            while (Input.GetMouseButton(0))
            {


                //鼠标屏幕上新位置
                mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);


                // 对象新坐标 
                transform.position = offset + camera.ScreenToWorldPoint(mScreenPosition);


                //协同,等待下一帧继续
                yield return new WaitForFixedUpdate();
            }


            print("drag compeleted");


        }
    }
}

/**************************************************************************************************************/

var spring = 50.0;
var damper = 5.0;
var drag = 10.0;
var angularDrag = 5.0;
var distance = 0.2;
var attachToCenterOfMass = false;


private var springJoint : SpringJoint;


function Update ()
{
// Make sure the user pressed the mouse down
if (!Input.GetMouseButtonDown (0))
return;


var mainCamera = FindCamera();

// We need to actually hit an object
var hit : RaycastHit;
if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition),  hit, 100))
return;
// We need to hit a rigidbody that is not kinematic
if (!hit.rigidbody || hit.rigidbody.isKinematic)
return;

if (!springJoint)
{
var go = new GameObject("Rigidbody dragger");
var body : Rigidbody = go.AddComponent ("Rigidbody") as Rigidbody;
springJoint = go.AddComponent ("SpringJoint");
body.isKinematic = true;
}

springJoint.transform.position = hit.point;
if (attachToCenterOfMass)
{
var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
anchor = springJoint.transform.InverseTransformPoint(anchor);
springJoint.anchor = anchor;
}
else
{
springJoint.anchor = Vector3.zero;
}

springJoint.spring = spring;
springJoint.damper = damper;
springJoint.maxDistance = distance;
springJoint.connectedBody = hit.rigidbody;

StartCoroutine ("DragObject", hit.distance);
}


function DragObject (distance : float)
{
var oldDrag = springJoint.connectedBody.drag;
var oldAngularDrag = springJoint.connectedBody.angularDrag;
springJoint.connectedBody.drag = drag;
springJoint.connectedBody.angularDrag = angularDrag;
var mainCamera = FindCamera();
while (Input.GetMouseButton (0))
{
var ray = mainCamera.ScreenPointToRay (Input.mousePosition);
springJoint.transform.position = ray.GetPoint(distance);
yield;
}
if (springJoint.connectedBody)
{
springJoint.connectedBody.drag = oldDrag;
springJoint.connectedBody.angularDrag = oldAngularDrag;
springJoint.connectedBody = null;
}
}


function FindCamera ()
{
if (camera)
return camera;
else
return Camera.main;
}

原创粉丝点击