前提・実現したいこと
UnityでC#scriptでの動作付け関する質問です。VR(FOVE)に接続しての使用を想定しています。
Unityとプログラミング両方初心者なため、うまく状況をお伝えできているか分かりませんが、説明不足な場合はご指摘をお願い致します。
【やりたいこと】
- 最初のクリックで、Maincameraを中心とした球上の特定の場所に、ランダムでMaincameraの子オブジェクトとして弾を生成し、かつMaincameraに向かって移動させる
- その後のクリックで、弾を停止させ、その時の弾とMaincameraの距離を測る
- その後のクリックで、弾を消す
→その後のクリックはまた1.に戻る
【現在の作成状況】
Unity上
・弾のPrefabの作成
・Maincameraの設置
Maincameraにアタッチするscript
Start
・「球上の特定の場所」をvector3型の配列("creatPoints")としてまとめる
・配列の中の順序をシャッフルする(unityスクリプトリファレンスの"リストをシャッフルする"を参照)
Update
if文を使い、クリック時の各動作を指定
[1回目クリック時]
・シャッフルした配列i番目の座標に弾を生成
・弾の親オブジェクトをMaincameraに指定
・Maincameraの位置取得
・Movetowardsで弾をMaincameraまで移動
[2回目クリック時]
・弾の移動を停止
・弾とMaincameraの距離を算出
[3回目クリック時]
・弾を消す
※以降のクリック時の挙動は、1回目クリック時 → 2回目クリック時 → 3回目クリック時 → 1回目クリック時 ... と繰り返していきます。
発生している問題
エラー表示は出ていないのですが、2回目のクリックの際、弾がわずかに動くだけでうまく移動してくれません。
その他の、1回目クリック時の挙動「Maincameraを中心とした球上のランダム位置での弾の生成」と3回目クリック時の挙動「弾の消去」は問題なく行われているようです。
該当のソースコード
Maincameraにアタッチしているscript
C#
1public class Move : MonoBehaviour 2{ 3 public GameObject Gun; 4 public GameObject MainCamera; 5 GameObject GunClone; 6 public List<GameObject> GunList = new List<GameObject>(); 7 private int flug = 0; 8 private int j = 0; 9 Vector3[] creatPoints = new Vector3[62]; 10 Vector3 targetPosition; 11 12 // Use this for initialization 13 void Start() 14 { 15 //※以下のような座標の指定をcreatPoints[0]~[61]まで書いていますが、長いのでここでは省略します。 16 17 //creatPoints[i] = new Vector3( 18 //半径 * Mathf.Cos(φ * Mathf.Deg2Rad) * Mathf.Sin(θ * Mathf.Deg2Rad), 19 //半径 * Mathf.Sin(φ * Mathf.Deg2Rad) 20 //半径 * Mathf.Cos(φ * Mathf.Deg2Rad) * Mathf.Cos(θ * Mathf.Deg2Rad)); 21 22 23 //シャッフル内容の確認作業 24 VeiwcreatPoints(); 25 Shuffle(); 26 VeiwcreatPoints(); 27 } 28 29 void Shuffle() //配列の中身をシャッフル 30 { 31 Debug.Log("Shuffle"); 32 for (int i = 0; i < creatPoints.Length; i++) 33 { 34 Vector3 temp = creatPoints[i]; 35 int randomIndex = Random.Range(0, creatPoints.Length); 36 creatPoints[i] = creatPoints[randomIndex]; 37 creatPoints[randomIndex] = temp; 38 } 39 } 40 41 void VeiwcreatPoints() //シャッフル内容確認のためのデバッグメソッド 42 { 43 for (int i = 0; i < creatPoints.Length; i++) 44 { 45 Debug.Log(creatPoints[i]); 46 } 47 } 48 49 // Update is called once per frame 50 void Update() 51 { 52 MainCamera = transform.root.gameObject; //MainCameraが一番上の階層のオブジェクト 53 54 if ((Input.GetMouseButtonDown(0)) && (this.flug == 0)) //マウス押下かつflug=0の時、弾の生成。その後flugを1に。 55 { 56 GunClone = (GameObject)Instantiate(Gun, this.transform.localPosition, Quaternion.identity); 57 GunClone.transform.parent = MainCamera.transform; 58 MainCamera.transform.localPosition = new Vector3(0, 0, 0); 59 GunClone.transform.localPosition = creatPoints[j]; 60 GunClone.transform.position = Vector3.MoveTowards(GunClone.transform.localPosition, MainCamera.transform.localPosition, 10f * Time.deltaTime); 61 this.flug = 1; 62 } 63 64 else if ((Input.GetMouseButtonDown(0)) && (this.flug == 1)) //マウス押下かつflug=1の時、弾を止め、距離の算出。その後flugを2に。 65 { 66 Time.timeScale = 0; 67 Vector3 GunClonePoint = GameObject.Find("Gun(Clone)").transform.position; 68 Debug.Log("Distance"); 69 Debug.Log(Vector3.Distance(GunClonePoint, targetPosition)); 70 this.flug = 2; 71 } 72 73 else if ((Input.GetMouseButtonDown(0)) && (this.flug == 2)) //マウス押下かつflug=2の時、弾を消す。その後jに+1する。 74 { 75 Destroy(this.GunClone); 76 this.flug = 0; 77 j++; 78 } 79 80 } 81}
試したこと
弾のPrefabに「移動のメソッドを描いたscript」を直接アタッチし、Maincameraにアタッチするscript内にはその弾Prefabの生成だけを記述してみましたが、前述と同様の結果になりました。
補足情報(FW/ツールのバージョンなど)
Unity5.6.3
あなたの回答
tips
プレビュー