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

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

新規登録して質問してみよう
ただいま回答率
85.35%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

2回答

4119閲覧

Prefabにスクリプトを参照させたい。

OHPGU

総合スコア2

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2021/09/13 08:54

Prefabにスクリプトを参照させたい。

オブジェクトをプレハブ化してランダムにスポーンさせ、そのオブジェクトをターゲットの方向に移動させたいのですが、ターゲットやスコアが書かれたスクリプトがプレハブ化すると参照できません。Instantitateさせた後参照する方法など教えていただけたら幸いです。

参照させたいソースコード

public class Enemy : MonoBehaviour { //ターゲット public GameObject target; public float speed; //スコア public CountText ct; private int Status; void Start() { ct = GameObject.Find("CountText").GetComponent<CountText>(); Status = 0; } void Update() { transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed); } public void OnClickAct() { Destroy(this.gameObject); if(Status == 0) { ct.Score += 10; } } }

プレハブを出現させるソースコード

[Header("Set Enemy Prefab")] public GameObject enemyPrefab; [Header("Set Interval Min and Max")] [Range(1f, 3f)] public float minTime = 2f; [Range(5f, 10f)] public float maxTime = 5f; [Header("Set X Position Min and Max")] [Range(-10f, 0f)] public float xMinPosition = -10f; [Range(0f, 10f)] public float xMaxPosition = 10f; [Header("Set Y Position Min and Max")] [Range(-10f, 0f)] public float yMinPosition = 0f; [Range(0f, 20f)] public float yMaxPosition = 10f; [Header("Set Z Position Min and Max")] private float interval; private float time = 0f; void Start() { interval = GetRandomTime(); } void Update() { time += Time.deltaTime; if (time > interval) {       //スポーン GameObject Enemy = Instantiate(enemyPrefab); Enemy.transform.position = GetRandomPosition(); time = 0f; interval = GetRandomTime(); } } private float GetRandomTime() { return Random.Range(minTime, maxTime); } private Vector3 GetRandomPosition() { float x = Random.Range(xMinPosition, xMaxPosition); float y = Random.Range(yMinPosition, yMaxPosition); return new Vector3(x, y); }

試したこと

Instantitateの後にGetComponentで試したのですが出来ませんでした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Enemyのインスタンス生成時にCountTextが存在するならctは取得できるはずです。
targetについても同様で、生成時にtargetとなるGameObjectが存在するなら、GameObject.Find紐づければよいです。
Enemyインスタンス生成時にtargetが存在しない可能性がある場合は、以下のようなコードとすればよいです。

C#

1//Enemy ClassのUpdate関数内にて 2void Update(){ 3 if(target == null){ 4 target = GameObject.Find("targetObjectName"); 5 }else{ 6 transform.position = Vector3.MoveTowards(transform.position, 7 target.transform.position, speed); 8}

もしくは、targetが生成された際にEnemyのtargetと紐づける場合は下記のようなコードとなります。

C#

1//targetにアタッチしているスクリプト内で 2void Start(){ 3 GameObject enemy = GameObject.Find("enemyObjectName"); 4 enemy.GetComponent<Enemy>().target = gameObject;//自分自身をEnemyのtargetに割り当て 5} 6 7//Enemyクラスにて 8void Update(){ 9 if(target != null){ 10 //target関連の処理を記載 11 } 12}

投稿2021/09/14 06:13

編集2021/09/14 06:14
YOshim

総合スコア1085

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

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

OHPGU

2021/09/22 07:55

スポナーのスクリプトにGameObject.Findなどで紐づけたらなんとかできました。ありがとうございます。
guest

0

この Enemy というスクリプトがプレハブに追加されているということから、

  • ct という変数にはインスペクターから何をアサインしていようが、Start() で "CountText" という名前の GameObject を探してその GameObject に追加されている CountText コンポーネント(の参照)が代入される
  • target という変数には、シーン内のオブジェクトをアサインした場合はプレハブにした時に none になる

という動きをするように書かれています。

従って、target に関しては Start で GameObject をシーンから探して取ってくる、あるいは Instantiate する側が target を指定してやる必要があります。

質問を見ると

ターゲットやスコアが書かれたスクリプトがプレハブ化すると参照できません。

と書いてあるので、ct も正しいものが参照できてないようですが、それは例えば "CountText" という名前が正しいのか、というチェックから始めて何が悪いのか突き止める必要があります。

投稿2021/09/13 11:52

bboydaisuke

総合スコア5308

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問