あるオブジェクトの座標を常に取得したいと思い、
Unityで対象のポイントへ等速で動かす(テラシュールブログ)
こちらを参考に、
c#
1 Vector3 "変数名"; -> GameObject "変数名";
に変更しようとしましたが、型が違うため変換できない。というエラーが出ました。
この場合、オブジェクトの取得方法として良いものはどのようなのがありますか・・・?
また、この手のエラーが出た時の対処の仕方等もご教授していただけると嬉しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
やりたいことは「endPosition
の座標を、インスペクタから固定値を設定するのではなく、あるオブジェクトの座標を取得してそこへ向かわせたい」ということでいいでしょうか?
一例としては、こんな書き換えが可能かと思います。なお、目的地オブジェクトの情報のうち必要なのはワールド座標だけであって、それを得るには目的地オブジェクトが持っているコンポーネントのうちTransformコンポーネントを調べれば十分なので、フィールドの型はGameObject
ではなくTransform
としています。
C#
1using UnityEngine; 2using System.Collections; 3 4public class Liner : MonoBehaviour 5{ 6 7 [SerializeField, Range(0, 10)] 8 float time = 1; 9 10 // これを... 11 // [SerializeField] 12 // Vector3 endPosition; 13 // これに置き換えるとすると... 14 [SerializeField] 15 Transform endTransform; 16 17 [SerializeField] 18 AnimationCurve curve; 19 20 private float startTime; 21 private Vector3 startPosition; 22 23 void OnEnable() 24 { 25 if (time <= 0) 26 { 27 // まず以下の記述がそのまま使えなくなる 28 // transform.position = endPosition; 29 // そこで、endTransformのpositionを目的地とすることにする 30 // ただし、値型であるVector3と異なり、参照型のTransformはnullになっているかもしれないので注意 31 transform.position = endTransform != null ? endTransform.position : Vector3.zero; 32 enabled = false; 33 return; 34 } 35 36 startTime = Time.timeSinceLevelLoad; 37 startPosition = transform.position; 38 } 39 40 void Update() 41 { 42 // このメソッドも書き換えが必要 43 // 複数箇所でendPositionが登場するが、これらをまとめてローカル変数に置き換えることにする 44 var endPosition = endTransform != null ? endTransform.position : Vector3.zero; 45 46 var diff = Time.timeSinceLevelLoad - startTime; 47 if (diff > time) 48 { 49 transform.position = endPosition; 50 enabled = false; 51 } 52 53 var rate = diff / time; 54 var pos = curve.Evaluate(rate); 55 56 transform.position = Vector3.Lerp(startPosition, endPosition, rate); 57 transform.position = Vector3.Lerp (startPosition, endPosition, pos); 58 } 59 60 void OnDrawGizmosSelected() 61 { 62 // このメソッドもUpdateと同様に書き換える 63 var endPosition = endTransform != null ? endTransform.position : Vector3.zero; 64 65#if UNITY_EDITOR 66 67 if (!UnityEditor.EditorApplication.isPlaying || enabled == false) 68 { 69 startPosition = transform.position; 70 } 71 72 UnityEditor.Handles.Label(endPosition, endPosition.ToString()); 73 UnityEditor.Handles.Label(startPosition, startPosition.ToString()); 74#endif 75 Gizmos.DrawSphere(endPosition, 0.1f); 76 Gizmos.DrawSphere(startPosition, 0.1f); 77 78 Gizmos.DrawLine(startPosition, endPosition); 79 } 80}
この手のエラーへの対処方法ですが、これについては状況によりけりかと思います。
今回の場合は、
- 目標地点
endPosition
はVector3型で表現されている - あるオブジェクトの座標は同じくVector3型であり、オブジェクトのTransformコンポーネントの
position
プロパティから取得できる position
から取得したVector3をendPosition
の代わりに目標地点座標として使用すればよい
という風に比較的単純に書き換えができますが、極端な話、Texture2D型変数にAudioClip型変数を代入しようとしても同様のエラーが発生するはずです。
やりたいことを明確化して、2つの型を繋ぐ適切なコードを考える必要があるでしょう。たとえばこの無理やりな例なら、こんな感じになるかと思います。
投稿2018/06/24 13:59
編集2018/06/24 14:04総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/25 22:21