Rayによって任意に動かせるゲームオブジェクトEyeと自身の座標がある一定以下になったときに自身もRayによって動くような機能を実装したいです。Fove0というHMDを使ったコンテンツを開発していて、Rayは視線を表し、その発信源はコライダを反転させた球の内側にあるカメラです。EyeはあらかじめRayと球体の内側の衝突位置を動くようプログラムされており、自分自身もEyeと重なったときにEyeと同じ挙動をするように実装したいです。そのようなスクリプトを書いてみましたが思ったように動きませんでした。問題は取得するEyeの座標が動いた後の座標ではなく、再生当初のEyeの座標を取得してしまっていると考えられることと、transitionがtrueになったあと、Rayに対応して動かずに、座標(0,0,0)の原点に戻ってしまうことです。transitionがtrueになったあとの処理はEyeと同じで、Eyeはちゃんと動いているのに自身は動いてくれません。
言葉足らずで分かりにくく、大変申し訳ありませんが回答よろしくお願いします。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Transition : MonoBehaviour { 6 7 private float nowTime; 8 private float distance; 9 private float cnt; 10 private bool transition = false; 11 public GameObject Eye; 12 public float startTime = 1f; 13 public float transitionTime = 0.5f; 14 15 public enum LeftOrRight 16 { 17 Left, 18 Right 19 } 20 21 [SerializeField] 22 public LeftOrRight whichEye; 23 public FoveInterfaceBase foveInterface; 24 private int layerMask = 1 << 9; 25 26 // Use this for initialization 27 void Start() 28 { 29 nowTime = 0f; 30 cnt = 0f; 31 layerMask = 1 << 9; 32 } 33 34 // Latepdate ensures that the object doesn't lag behind the user's head motion 35 void Update() 36 { 37 if (transition) 38 { 39 //transform.position = Eye.transform.position; 40 FoveInterfaceBase.EyeRays rays = foveInterface.GetGazeRays(); 41 42 Ray r = whichEye == LeftOrRight.Left ? rays.left : rays.right; 43 44 RaycastHit hit; 45 Physics.Raycast(r, out hit, Mathf.Infinity, layerMask); 46 if (hit.point != Vector3.zero) // Vector3 is non-nullable; comparing to null is always false 47 { 48 transform.position = hit.point; 49 } 50 else 51 { 52 transform.position = r.GetPoint(3.0f); 53 } 54 return; 55 } 56 57 //startTimeをこえるまでは処理をしない。 58 nowTime += Time.deltaTime; 59 if (nowTime < startTime) 60 { 61 return; 62 } 63 64 //自分とEyeとの距離がある一定以下になった時間をカウント 65 distance = (transform.position - Eye.transform.position).sqrMagnitude; 66 if(cnt > 0f && distance > 1f) 67 { 68 cnt = 0f; 69 return; 70 } 71 if(distance < 1f) 72 { 73 cnt += Time.deltaTime ; 74 } 75 76 if (cnt > transitionTime) 77 { 78 transition = true; 79 } 80 } 81} 82
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/03 05:53
2018/10/03 06:14