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

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

ただいまの
回答率

90.62%

  • Unity

    3836questions

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

  • Unity3D

    1251questions

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

  • Unity2D

    838questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 128

GOTOken

score 33

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

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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

やりたいことは「endPositionの座標を、インスペクタから固定値を設定するのではなく、あるオブジェクトの座標を取得してそこへ向かわせたい」ということでいいでしょうか?

一例としては、こんな書き換えが可能かと思います。なお、目的地オブジェクトの情報のうち必要なのはワールド座標だけであって、それを得るには目的地オブジェクトが持っているコンポーネントのうちTransformコンポーネントを調べれば十分なので、フィールドの型はGameObjectではなくTransformとしています。

using UnityEngine;
using System.Collections;

public class Liner : MonoBehaviour
{

    [SerializeField, Range(0, 10)]
    float time = 1;

    // これを...
    // [SerializeField]
    // Vector3 endPosition;
    // これに置き換えるとすると...
    [SerializeField]
    Transform endTransform;

    [SerializeField]
    AnimationCurve curve;

    private float startTime;
    private Vector3 startPosition;

    void OnEnable()
    {
        if (time <= 0)
        {
            // まず以下の記述がそのまま使えなくなる
            // transform.position = endPosition;
            // そこで、endTransformのpositionを目的地とすることにする
            // ただし、値型であるVector3と異なり、参照型のTransformはnullになっているかもしれないので注意
            transform.position = endTransform != null ? endTransform.position : Vector3.zero;
            enabled = false;
            return;
        }

        startTime = Time.timeSinceLevelLoad;
        startPosition = transform.position;
    }

    void Update()
    {
        // このメソッドも書き換えが必要
        // 複数箇所でendPositionが登場するが、これらをまとめてローカル変数に置き換えることにする
        var endPosition = endTransform != null ? endTransform.position : Vector3.zero;

        var diff = Time.timeSinceLevelLoad - startTime;
        if (diff > time)
        {
            transform.position = endPosition;
            enabled = false;
        }

        var rate = diff / time;
        var pos = curve.Evaluate(rate);

        transform.position = Vector3.Lerp(startPosition, endPosition, rate);
        transform.position = Vector3.Lerp (startPosition, endPosition, pos);
    }

    void OnDrawGizmosSelected()
    {
        // このメソッドもUpdateと同様に書き換える
        var endPosition = endTransform != null ? endTransform.position : Vector3.zero;

#if UNITY_EDITOR

        if (!UnityEditor.EditorApplication.isPlaying || enabled == false)
        {
            startPosition = transform.position;
        }

        UnityEditor.Handles.Label(endPosition, endPosition.ToString());
        UnityEditor.Handles.Label(startPosition, startPosition.ToString());
#endif
        Gizmos.DrawSphere(endPosition, 0.1f);
        Gizmos.DrawSphere(startPosition, 0.1f);

        Gizmos.DrawLine(startPosition, endPosition);
    }
}

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

  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/26 07:21

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    3836questions

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

  • Unity3D

    1251questions

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

  • Unity2D

    838questions