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

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

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

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

Q&A

解決済

1回答

1309閲覧

UnityのCarWaypointBasedの生成

essex

総合スコア21

Unity

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

0グッド

0クリップ

投稿2017/09/18 12:17

Unityで勉強がてら自動車のゲームを作っています。
現在やりたいのは、自律走行する敵車の、
スクリプトからの生成です。

http://tf.hateblo.jp/entry/2015/07/05/230728

こちらのブログを参考にさせていただき、
Standard AssetsのCarWaypointBasedを使って、
自律走行する敵車はできました。

これをプレハブとして保存し、(CarWaypointBased自身もプレハブですが)、
以下の様なコードでインスタンスを生成してみました。

void Update () {
if (Input.GetKeyDown(KeyCode.Escape))
{
GameObject obj = Instantiate(target, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.Euler(0, 180, 0)) as GameObject;
}
}

結果的には、これで敵車のインスタンスは生成されますが、
走りません。

調べてみたところ、アタッチされている
WaypointRrogressTracker(script)の
「Circuit」がNone(Waypoint Circuit)、
CarAIControl(script)の
「Target」がNone(Transform)になっています。

そこでゲームを動かしたまま、Inspector上で、
「Circuit」と「Target」を手動でアサインし、
CarAIControl(script)をenableにすると、
普通に走り出します。
しかし、どちらもインスタンスが生成されていない状態では、
アサインできない様です。
(敵車のインスタンスと同時に生成される
CarWaypointBased(Clone) Waypoint Target等を
渡さなければならないみたいです。)

それならと、インスタンスを生成した後で、
スクリプトからセットしようとしたのですが、
Inspectorからは設定できるのに、
GetComponentでスクリプトに渡そうとしても、
「Circuit」や「Target」の引数が見あたりません。

スクリプトで生成した敵車のインスタンスに、
WaypointRrogressTracker(script)の
「Circuit」とCarAIControl(script)の
「Target」をセットするのは、どの様にすれば良いでしょうか?

色々調べてみたのですが、誰もはまらないのか、
情報が見つけられませんでした。
どうかご教示、お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

WaypointRrogressTrackerについては、

C#

1 [SerializeField] private WaypointCircuit circuit; // A reference to the waypoint-based route we should follow

となっているところが、Inspectorに表示される部分です。
これを、

C#

1 public WaypointCircuit circuit; // A reference to the waypoint-based route we should follow

とすることで、スクリプト上で変更することが出来るようになります。

CarAIControlについては、以下のような関数があったので、これを使えばよいと思います。

C#

1 public void SetTarget(Transform target) 2 { 3 m_Target = target; 4 m_Driving = true; 5 }

投稿2017/09/18 13:07

fiveHundred

総合スコア9797

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

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

essex

2017/09/19 02:22

fiveHundred様 早速のアドバイス、ありがとうございます。 とても勉強になります。 WaypointRrogressTrackerについては、 教えていただいたとおりにpublicに変更したところ、 「Circuit」が渡せたと思います。 CarAIControlのSetTarget関数も使えるのではないかと思われますが、 私の理解が至らず、CarAIControllerにTargetがうまく渡せません。 http://tsubakit1.hateblo.jp/entry/2015/04/07/003816 こちらの方のブログにありますがTargetに設定したいのは、 CarWaypointBasedオブジェクト>Helpers>WaypointTargetObjectです。 これは、適車のインスタンスを生成すると、一緒に生成されます。 (その際、Hierarchyウインドウには、以下の様に表示されます) CarWaypointBased(Clone) CarWaypointBased(Clone) Waypoint Target このCarWaypointBased(Clone) Waypoint Targetが渡したい値なのですが、 動的に生成されるため、生成後に設定する方法が分かりません。 例えばこんな風に書いてもみましたが、うまく設定できませんでした。 obj.GetComponent<CarAIControl>().SetTarget(GameObject.Find("CarWaypointBased(Clone) Waypoint Target").transform); 任意のtransformを渡してやるとそちらの方へ走っていくので、 SetTarget関数の使い方自体は、合っている気もするのですが、 CloneのTargetをどの様にしたらうまく渡せるのでしょうか? アドバイス下さると嬉しいです。 よろしくお願いします。
fiveHundred

2017/09/19 04:00

obj.GetComponent<CarAIControl>().SetTarget(obj.transform.Find("Helpers/WaypointTargetObject")); としてみてください。 (transform.Find()は、その子オブジェクトから探す関数です)
essex

2017/09/19 05:02 編集

fiveHundred様 アドバイス、ありがとうございます。 なるほど…こういうやり方があるのですね。 実はGameObject.Find("CarWaypointBased(Clone) Waypoint Target")…だと、 インスタンスを複数生成した場合、全部名前が同じなのでどうしよう… と思っていたのですが、 子オブジェクトから探すことができるのですね。 大変勉強になります。 これでできそうな気がしますが、 週末まで機能確認できないので、 確認するまで、このスレッドを開けたままにさせて下さい。 週末結果をご報告します。
fiveHundred

2017/09/19 06:18

気づいたこと&あやふやなところがあったので、追記します。 先のコメントでは、CarWaypointBased(Clone)/Helpers/WaypointTargetObjectがTargetにセットされます。 CarWaypointBased(Clone) Waypoint Targetではないです。 CarWaypointBased(Clone) Waypoint Targetは、WaypointProgressTrackerのTargetに何も設定されていないときに生成される、仮のオブジェクトのようです。 「obj.GetComponent<WaypointProgressTracker>().target = obj.transform.Find("Helpers/WaypointTargetObject");」とすれば、Targetを設定することができます。 ただ、CarAIControlとWaypointProgressTrackerのTargetは、同じプレハブのHelpers/WaypointTargetObjectに設定することになるため、この2つはスクリプトに頼らなくてもInspectorの設定でいけるような気がします。 そのため、修正する時には以下の手順で修正してみてください。 1. WaypointCircuitのcircuitはスクリプト上で設定し、CarAIControlとWaypointProgressTrackerのTargetはInspector上で設定してみる(同じプレハブのHelpers/WaypointTargetObject) 2. うまくいかないなら、3つとも全てスクリプト上で設定してみる
essex

2017/09/22 15:54

fiveHundred様 アドバイスを色々ありがとうございます。 また回答が遅くなり、大変申し訳ありません。 結論から申し上げますと、残念ながら今のところ上手くできていません。 以下、アドバイスいただいた様にやってみました。 1 WaypointCircuitのcircuitはスクリプト上で設定できました。 しかしCarAIControlとWaypointProgressTrackerのTargetをInspector上で 設定することができませんでした。以下の様な状況です。  プレハブの状態ではHierarchyウィンドウ上に敵車が表示されないので、 projectウィンドウでプレハブを開いてInspectorから設定しようとしてみたのですが、 ○ 同じプレハブの中にHelpersはありますが、projectウィンドウではそれを開くことができないため、 その中のWaypointTargetObjectを選択することができませんでした。 ○ インスタンスを生成すると手動でtargetを設定できるようになりますが、プレハブの状態ですと、 進入禁止のアイコンが表示され、値の設定ができませんでした。 どうもInspectorで設定するためには、オブジェクトがHierarchyに表示されていないと 操作できない様な感じです。 2 次にスクリプト上で設定に挑戦してみました。その結果 ○ Circuitは設定できました。 ○ obj.GetComponent<WaypointProgressTracker>().target = obj.transform.Find("Helpers/WaypointTargetObject"); と記述すると、エラーは出ませんが敵車は走りませんでした。 Inspectorで確認すると、Targetが「Missing Transform」になっています。 また、この1行を追加する前は、敵車のインスタンスと同時にHierarchyに追加された CarWaypointBased(Clone) Waypoint Target が追加されなくなりました。 また、前回の様に obj.GetComponent<CarAIControl>().SetTarget(obj.transform.Find("Helpers/WaypointTargetObject")); と書いてみたところ、敵車は同じ所をぐるぐる回っています。 ここで敵車に渡したいCarWaypointBased(Clone) Waypoint Targetは、 本来Waypoint上を移動するのですが、それが動かないため、同じ所を回っているようです。 特に良く分からないのは、 obj.GetComponent<WaypointProgressTracker>().target = obj.transform.Find("Helpers/WaypointTargetObject"); と書くと、エラーが出ないのに「Missing Transform」になる点です。 本当に CarWaypointBasedオブジェクト>Helpers>WaypointTargetObjectなら、 Hierarchyウィンドウでは CarWaypointBased(Clone)  >Helpers   >WaypointTargetObject と表示されるはずですが、実際は CarWaypointBased(Clone) CarWaypointBased(Clone) Waypoint Target と表示されています。 なので、「ひょっとしたらCarWaypointBased(Clone)と横並びにあるのでは?」と思い、 Instantiateから少し時間をおいて obj.GetComponent<CarAIControl>().SetTarget(GameObject.Find("CarWaypointBased(Clone) Waypoint Target").transform); を実行してみた所、正常にセットできることが分かりました。 ただ、この指定の仕方ですと、最初の敵車には正しくTargetが渡せますが、 全てのTargetが同じ名前になるため、2台目以降の敵車にtargetが渡せない問題があります。 何か良い指定の方法がありますでしょうか? 色々教えていただいているのに、 なかなか上手くできなくて済みません。 よろしくお願いします。
fiveHundred

2017/09/23 00:58

1. 以下のようにすることで、プレハブ内の内容を変更することが出来ますが、それは試されましたでしょうか? 1) プレハブをHierarchyウィンドウにドラッグアンドドロップする (空のシーンでやることがおすすめ) 2) Hierarchyウィンドウに出てきたプレハブをInspectorウィンドウで編集する (今回の場合、CarAIControlとWaypointProgressTrackerのTargetに、 Hierarchy上のWaypointTargetObjectを設定する) 3) Inspectorウィンドウの右上付近にある「Apply」ボタンを押下 4) Hierarchyウィンドウのプレハブは不要なので削除 2. 「obj.GetComponent<WaypointProgressTracker>().target = obj.transform.Find("Helpers/WaypointTargetObject");」と「obj.GetComponent<CarAIControl>().SetTarget(obj.transform.Find("Helpers/WaypointTargetObject"));」は同時に実行しましたでしょうか?
essex

2017/09/23 06:55

fiveHundred様 アドバイス、ありがとうございます。 お陰様で敵車の生成ができる様になりました。 以下、前回の結果についてご報告いたします。 1 プレハブを一度Hierarchyウィンドウに移動して、設定を変更する。   教えていただいたとおりの手順で、設定の変更ができました。  なるほど、一度Hierarchyウィンドウに移動して、更にApplyが必要なのですね。  勉強になります。     この方法でTargetを設定することはできましたが、生成した敵車は  Targetの初期位置の周囲をくるくる回るだけでした。targetが初期位置から  動かない状態でした。 2 obj.GetComponent<WaypointProgressTracker>().target = obj.transform.Find("Helpers/WaypointTargetObject");  とobj.GetComponent<CarAIControl>().SetTarget(obj.transform.Find("Helpers/WaypointTargetObject"));を同時に実行する。     していませんでした。SetTargetで引数を渡したら、.targetの設定は不要なのだと考えていました。  ご指摘の通り、両方同時に実行したら、正常にTargetが渡せる様になりました。     ということは、CarWaypointBased>Helpers>WaypointTargetObjectがtargetだというのは正しかったのですね。  CarWaypointBased(Clone) Waypoint Targetが仮のオブジェクトであるとか、色々調べても分からず、  自力では解決できませんでした。      とても勉強になりました。非常に助かりました。  色々ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問