bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

オブジェクトを掴む

オブジェクトをドラッグする処理を作ってみた。

https://dl.dropbox.com/u/67579260/Unity/Flick01/Flick01.html

using UnityEngine;
using System.Collections;

public class cMain : MonoBehaviour {

	// Use this for initialization
	void Start () {
		StartCoroutine(Flick());
	}
	
	// Update is called once per frame
	void Update () {
	}
	
	/**
	 * @brief 無限ループ.
	 */
	IEnumerator Flick() {
		
		Vector3 LiftUp = 1.0f*Vector3.zero;
		while(true) {
			GameObject target = null;
			bool isEnd = false;
			while(!isEnd) {
				if(Input.GetMouseButtonDown(0)) {
					Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
					RaycastHit hit;
					int layer = 1<<LayerMask.NameToLayer("Flick");
					if(Physics.Raycast(ray, out hit, Mathf.Infinity, layer)) {
						target = hit.collider.gameObject;
						if(target != null) {
							isEnd = true;
							target.renderer.material.color = Color.red;
							target.transform.position += LiftUp;
						}
					}
				}
				yield return 0;
			}
			
			isEnd = false;
			while(Input.GetMouseButton(0)) {
				yield return 0;
				Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
				Vector3 planeNormal = Vector3.up;
				float planeDistance = 0.0f;
				Vector3 p = IntersectRayPlane(ray, planeNormal, planeDistance);
				target.transform.position = p + LiftUp;
			}
			
			target.renderer.material.color = Color.white;
			target.transform.position -= LiftUp;
		}
	}
	
	/**
	 * @brief	直線と平面の交点.
	 */
	Vector3 IntersectRayPlane(Ray ray, Vector3 planeN, float planeD) {
		float t = -planeD-Vector3.Dot(planeN, ray.origin)/Vector3.Dot(planeN, ray.direction);
		return ray.origin + t * ray.direction;
	}
}