ドラッグでオブジェクトを動かすサンプル

using UnityEngine;
using System.Collections;

public class RayCastTest2 : MonoBehaviour {
  
   enum STEP {
       NONE = -1,
       IDLE = 0,
       DRAGING,
       RESTART,
   }
   
   STEP step = STEP.NONE;
   STEP nextStep = STEP.NONE;
   
   bool isNowDraging = false;
   
   Vector3 grabOffset = Vector3.zero;
   
   // Use this for initialization
   void Start () {
   }

  // Update is called once per frame
   void Update () {
       
       //遷移
       switch(step){
           
           case STEP.NONE:{
               nextStep = STEP.RESTART;
           }
           break;
           
           case STEP.IDLE:{
               if(isNowDraging){
                   nextStep = STEP.DRAGING;
               }
           }
           break;
           
           case STEP.DRAGING:{
               if(!isNowDraging){
                   nextStep = STEP.IDLE;
               }
           }
           break;
           
           case STEP.RESTART:{
           }
           break;
       }
       
       
       //初期化
       while(nextStep != STEP.NONE)
       {
           step = nextStep;
           nextStep = STEP.NONE;    //必ずstepの内容をnextStepに遷移させ初期化を一度だけ行う 
           
           switch(step){
               
               case STEP.NONE:{
               }
               break;
               
               case STEP.IDLE:{
               }
               break;
               
               case STEP.DRAGING:{
                   BeginDragging();
               }
               break;
               
               case STEP.RESTART:{
                   nextStep = STEP.IDLE;
               }
               break;
           }
       }
       
       //実行
       switch(step){
           
           case STEP.NONE:{
           }
           break;
           
           case STEP.IDLE:{
           }
           break;
           
           case STEP.DRAGING:{
               DoDragging();
           }
           break;
           
           case STEP.RESTART:{
           }
           break;
       }
   }
   
   //画面のマウス位置から逆透視変換してクリックした座標を割り出す
   bool UnProjectMousePosition(out Vector3 worldPos,Vector3 mousePostion){
       
       float depth;
       bool ret;
       
       Plane plane = new Plane(Vector3.up,Vector3.zero);
       
       Ray camRay = Camera.main.ScreenPointToRay(mousePostion);
       if(plane.Raycast(camRay,out depth)){
           worldPos = camRay.origin + camRay.direction * depth;
           ret = true;
       }else{
           worldPos = Vector3.zero;
           ret = false;
       }
       
       return ret;
   }
   
   //ドラッグ時の初期化
   //最初のクリック時にオフセットを記録する
   void BeginDragging(){
       
       do {
           Vector3 worldPosition;
           if(!UnProjectMousePosition(out worldPosition,Input.mousePosition)){break;}
           grabOffset = this.transform.position - worldPosition;    //falseが返ってきたらここは飛ばされる
       }while(false);
       
   }
   
   //ドラッグ時の処理
   //記録したオフセットを利用して位置を変更する
   void DoDragging(){
       
       do {
           Vector3 worldPosition;
           if(!UnProjectMousePosition(out worldPosition,Input.mousePosition)){break;}
           this.transform.position = worldPosition + grabOffset;
       }while(false);
       
   }
   
   //ここで重要なのはコリジョンに触れた状態でこれを検出している点!
   void OnMouseDown(){
       isNowDraging = true;
   }
   
   //これも同様でコリジョンに触れて状態でこれを検出している
   void OnMouseUp(){
       isNowDraging = false;
   }
}


メニュー



  • 最終更新:2014-06-13 12:05:26

このWIKIを編集するにはパスワード入力が必要です

認証パスワード