Unity3D範例之3.DragRigidbody
DragRigidbody.cs
using UnityEngine; using System.Collections; public class DragRigidbody : MonoBehaviour { public float spring; public float damper; public float drag; public float angularDrag; public float distance; public bool attachToCenterOfMass; private SpringJoint springJoint; private Rigidbody body; // Use this for initialization void Start () { spring = 50.0f; damper = 5.0f; drag = 10.0f; angularDrag = 5.9f; distance = 0.2f; attachToCenterOfMass = false; } // Update is called once per frame void Update () { if(!Input.GetMouseButtonDown(0)) return; Camera mainCamera = FindCamera(); RaycastHit hit; //檢測滑鼠按鍵是否點擊 if(!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition),out hit,100)) return; //是否有點擊到剛性物體或剛性物體可被物理控制 if(!hit.rigidbody||hit.rigidbody.isKinematic) return; if(!springJoint){ //彈性物體是否存在 //新增一個名稱為"Rigidbody dragger"的遊戲物件 GameObject go = new GameObject("Rigidbody dragger"); body = (Rigidbody)go.AddComponent("Rigidbody"); springJoint = (SpringJoint)go.AddComponent("SpringJoint"); body.isKinematic = true; } springJoint.transform.position = hit.point; if(attachToCenterOfMass){ Vector3 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); } IEnumerator DragObject(float distance){ float oldDrag = springJoint.connectedBody.drag; float oldAngularDrag = springJoint.connectedBody.angularDrag; springJoint.connectedBody.drag = drag; springJoint.connectedBody.angularDrag = angularDrag; Camera mainCamera = FindCamera(); while(Input.GetMouseButton(0)){ Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); springJoint.transform.position = ray.GetPoint(distance); yield return 0; } if(springJoint.connectedBody){ springJoint.connectedBody.drag = oldDrag; springJoint.connectedBody.angularDrag = oldAngularDrag; springJoint.connectedBody = null; } } //取得主要攝影機 Camera FindCamera(){ if(camera){ return camera; }else{ return Camera.main; //回傳標註為MainCamera的攝影機物件 } } }
留言
張貼留言