質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1640閲覧

型が違うというエラーが出た時の対処方法

GOTOken

総合スコア54

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/06/24 07:24

あるオブジェクトの座標を常に取得したいと思い、
Unityで対象のポイントへ等速で動かす(テラシュールブログ)
こちらを参考に、

c#

1 Vector3 "変数名"; -> GameObject "変数名";

に変更しようとしましたが、型が違うため変換できない。というエラーが出ました。
この場合、オブジェクトの取得方法として良いものはどのようなのがありますか・・・?

また、この手のエラーが出た時の対処の仕方等もご教授していただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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}

この手のエラーへの対処方法ですが、これについては状況によりけりかと思います。
今回の場合は、

  1. 目標地点endPositionはVector3型で表現されている
  2. あるオブジェクトの座標は同じくVector3型であり、オブジェクトのTransformコンポーネントのpositionプロパティから取得できる
  3. positionから取得したVector3をendPositionの代わりに目標地点座標として使用すればよい

という風に比較的単純に書き換えができますが、極端な話、Texture2D型変数にAudioClip型変数を代入しようとしても同様のエラーが発生するはずです。
やりたいことを明確化して、2つの型を繋ぐ適切なコードを考える必要があるでしょう。たとえばこの無理やりな例なら、こんな感じになるかと思います。

  1. Texture2D型変数にAudioClip型変数を代入したい」...がエラーが出る
  2. 本当にやりたいことは「AudioClipの波形を画像化しTexture2Dにしたい」
  3. AudioClipから音声データ列を取り出す方法を調べる...GetDataが使えそう
  4. ピクセルデータ列からTexture2Dを作る方法を調べる...SetPixelsが使えそう
  5. AudioClipから音声データを取り出し、それを加工してピクセルデータを作り、それを基にTexture2Dを生成する

投稿2018/06/24 13:59

編集2018/06/24 14:04
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOTOken

2018/06/25 22:21

なるほど!ということは、理屈的には違う型の変数を代入する場合、宣言の仕方を変えたりすればよいということですかね・・・? もう少し、根本的な勉強が必要なのかもしれませんね・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問