質問編集履歴

1 スクリプトを更新しました、

adisa

adisa score 6

2018/01/29 22:08  投稿

Rayで動かしているオブジェクトをマウスクリックで固定したいです。
### ヘディングのテキスト### 前提・実現したいこと
Plane(Colider付き)の床の上で、マウスに追従する動きで指定されたオブジェクトを動かし、マウスの左クリックで固定を目指しています。マウスの追従に関してはMain CameraにアタッチされているRay(光線)によって追従は成功しており、Plane上に動いています。しかし、マウスをクリックして固定させる方法が上手に行きません。Rayに関するScriptを無効にしたり、Rigidbodyでx,y,zを固定にしても失敗しました。どなたかご教授お願いします。
(Script無効に関するものは、ボタンを押して特定のオブジェクトを生成するのですが、2つ以上のオブジェクトも動かなくなるので失敗しました)
```
ソースコード
```using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Drag : MonoBehaviour
public class ray2 : MonoBehaviour
{
   [SerializeField]
   private GameObject m_object = null;
   //public GameObject targetObject;
   
   Vector3 m_ZAixs;
   public Rigidbody m_Rigidbody;
   public GameObject Light;
   // Use this for initialization
   void Start()
   {
       m_Rigidbody = Light.GetComponent<Rigidbody>();  
       m_Rigidbody.constraints = RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezePositionZ;  
 
       // Update is called once per frame  
   }
   // Update is called once per frame  
   void Update()
   {
       Vector2 touchScreenPosition = Input.mousePosition;
       touchScreenPosition.x = Mathf.Clamp(touchScreenPosition.x, 0.0f, Screen.width);
       touchScreenPosition.y = Mathf.Clamp(touchScreenPosition.y, 0.0f, Screen.height);
       Camera gameCamera = Camera.main;
       Ray touchPointToRay = gameCamera.ScreenPointToRay(touchScreenPosition);
       RaycastHit hitInfo = new RaycastHit();
       if (Physics.Raycast(touchPointToRay, out hitInfo))
       if (Input.GetMouseButtonDown(0))
       {
           m_object.transform.position = hitInfo.point;
           Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
           RaycastHit hit;
           if (Physics.Raycast(ray, out hit, Mathf.Infinity))
           {
               GameObject t = GameObject.Find("SpotLightWhite 1 1(Clone)");
               var targetPos = new Vector3(hit.point.x, hit.point.y, hit.point.z);
               t.transform.position = targetPos;
           }
       }
 
       Debug.DrawRay(touchPointToRay.origin, touchPointToRay.direction * 1000.0f);  
 
       if (Input.GetKeyDown(KeyCode.S))
       {
           GetComponent<Drag>().enabled = false;
           //Light.GetComponent<Rigidbody>();
           //m_Rigidbody.constraints = RigidbodyConstraints.FreezeAll;
       }
   }
}
 
### 試したこと
オブジェクトにRigidbodyを付与して、Frezzeしても動きます。
Rayで動かすScriptを無効化してもダメでした。
オブジェクトのTagを、マウスクリックした段階で変え、親ペアレントをカメラからPlaneに変えても失敗しました。
### 補足情報(FW/ツールのバージョンなど)
Unity Ver2017,3です
  • C#

    16174 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    11886 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    3848 questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る