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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

2回答

1808閲覧

生成されたプレハブのスクリプトのpublicboolを参照し、そのboolのtrue,falseで別スクリプトのboolをtrue,falseにしたい

Kageyama_23457

総合スコア21

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2020/02/23 09:20

編集2020/02/26 00:02

書き換えました

2月26
回答を頂き、「ゲーム実行前にはヒエラルキに存在していないプレハブを取得する記述」に書き換えました。
しかし結局「スクリプトAのboolでスクリプトBのboolをtrue,falseにする」については、
とりあえずのところstaticで解決するというところに行き着きました。
超初歩的なことで質問ページを立ててしまい大変お恥ずかしいのですが、このまま残しておきます。
###前提
Unity、C#ともに初心者なので至らぬ点あるかと思いますがご容赦ください。
非営利目的の、あるマンガの二次創作ゲームを作っています。障害物競争のようなゲームです。
キャラが13人いて、障害物や加速アイテム、必殺技アイテムなどがあります。
今回は必殺技の発動について質問します。

キャラA:自機スクリプト、Rigidbody2D、コライダ2D持ち。
キャラB~N:いわゆるCPU。CPUスクリプト、Rigidbody2D、コライダ2D持ち。
自機スクリプトをつけかえれば13人の中から好きに自機キャラを選べる状態です。
必殺技アイテム:画像ファイル(2Dスプライト)。スクリプト、Rigidbody2D、コライダ持ち。プレハブ化されており、アイテム生成オブジェクトからランダムに生成され移動します。

13人はそれぞれ違う必殺技を持っており、必殺技アイテムを取るとそれが発動します。
今回はその中の一人、他のキャラを小さくする能力について質問します。
仮にこの能力のキャラをAとします。

必殺技アイテムのスクリプト(プレハブで量産。大元のオブジェクトのスクリプトではなく、プレハブのスクリプトを別スクリプトから参照したい→staticでとりあえず解決)

C#

1public static bool isA=false;//キャラAと接触した際のbool、staticにしておく 2 3 private void OnCollisionEnter2D(Collision2D collision)//衝突判定 4 { 5 if(collision.gameObject.tag ==Atag)//キャラAとの接触判定 6 { 7 StartCoroutine(CI_A());//キャラAと接触した際のコルーチンスタート 8 } 9 } 10 11 IEnumerator CI_A()//キャラAと接触した際のコルーチン 12 { 13 isA = true; 14 anim_CI_Ctrl.SetBool("CI_A", true);//UIイメージでの必殺技アニメーション 15 16 yield return new WaitForSeconds(2); 17 18 isA = false; 19 anim_CI_Ctrl.SetBool("CI_A", false); 20 }

他キャラ(小さくされるキャラたち)のスクリプト

C#

1 private GameObject _ObjectG,_saprefab=null;//ジェネレータとプレハブ変数宣言 2 3void Start() 4{ 5 _ObjectG = GameObject.Find("ObjectGenerator"); 6 _saprefab = _ObjectG.GetComponent<SA>().gameObject;//ここで生成される前にプレハブを取得していますが↓ 7} 8 9void Update() 10{ 11 12 if(SAprefab.isA==true)//staticで解決するので上記プレハブの取得は結果不要でした 13 {Debug.Log("小さくされた!"); 14 StartCoroutine(A());//小さくされるコルーチン開始 コルーチンの方はまた別の不具合が出ているので今回は載せません 15 } 16}

プレハブを生成する空のゲームオブジェクトのスクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; public class SA : MonoBehaviour { public GameObject SAPrefab;//なんのプレハブを量産するのか private float interval;//何秒ごとに生成するのか private float time = 0f;//経過時間 public List<GameObject> StandAList = new List<GameObject>();//リスト化 これを小さくされるキャラのスクリプトから参照し、生成される前にプレハブを取得 void Start() { interval = 1f;//何秒ごとに生成するのか } void Update() { time += Time.deltaTime; if (time > interval)//経過時間が生成時間になったら(1秒たったら) { GameObject SA = Instantiate(SAPrefab);//必殺技アイテムのプレハブを生成する StandAList.Add(StandA);//生成されたプレハブをリストに追加 float x = Random.Range(-8f, 8f); float y = Random.Range(-4f, -200f); StandA.transform.position = new Vector2(x, y); time = 0f;//経過時間初期化 } } }

補足情報(FW/ツールのバージョンなど)

■作業環境
Mac Sierra10.12.6(4GB)
Unity2019.3.f06

■ここまで出来ていること
・プレイヤーキャラクターの移動(AddForce)及びアニメ遷移
・カメラのプレイヤー追従(y軸のみ)
・加速アイテム実装
・オブジェクトのランダム座標生成、及びランダムな方向への移動
・Gridを使いTileMapで背景を塗りました
・CPUキャラの親オブジェクトと検知用子オブジェクトの連携
・UIイメージを用いての、必殺技CIアニメ実装

ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
そちらのページも貼っておきます。

加速アイテム実装
オブジェクトランダム生成及びランダム移動

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。
現在はプレハブの生成元を参照している為に問題が発生しているかと思います。

「ゲームを実行しないと存在しないプレハブを取得させる記述」というものがあるのでしょうか?

あります。
必殺技アイテムをPrefabから動的生成(Instantiate)した後で変数に代入して下さい。

これだけでは判らない場合はInstantiateしているコード部分を追記して下さい。

投稿2020/02/25 02:51

Hawn

総合スコア1222

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

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

Kageyama_23457

2020/02/25 03:14

ha_wn様 ご回答ありがとうございます。変数への代入を途中まで試みましたが自力では無理だと思ったのでInstantiateしているスクリプトを追加しました。ご教授お願い致します。
Hawn

2020/02/25 04:45

>「ゲームを実行しないと存在しないプレハブを取得させる記述」 これの方法だけ書けば 1.フィールド変数に「public List<GameObject> StandAList;」を追加 2.「//必殺技アイテムのプレハブを生成する」の行の下に「StandAList.Add(StandA);」を追加 3.以降はStandAListの要素を参照 これで可能です。
Hawn

2020/02/25 05:00 編集

今までの流れを見ると参照出来たところで目的達成まで苦労すると思います。 無理な場合は設計からやり直した方が良いです。 その辺り文章で教えきれる自信無いので以降は他の方に教えて貰って下さい。
Kageyama_23457

2020/02/26 00:16

質問欄に反映させた通りですが、5時間格闘した挙句staticで解決することに気づきました。別の箇所でstaticを使っていたのにというのにお恥ずかしい限りです。 ですが今回ご教授頂いた「生成前のプレハブ取得」もいずれ使うときがあると思うので、自分用メモも兼ねてこのように残しておきます。 >参照できたところで〜 >無理な場合は〜 ごもっともだと思います。たったの3ヶ月前にUnityとC#をかじり出した身分です。苦労しない方がおかしいです。安易に「◯◯のスクリプトをください」という質問を立ててゲームを作って行っては、先人方にも他の方たちにも失礼だと思います。 13人分の能力の実装やその他諸々、行き詰まったら何か他の方法や、それまでにできた方法で代用、応用できないか? という柔らかくて広い思考、視野を持つことにします。 この度はありがとうございました。御礼申し上げます。
Hawn

2020/02/26 12:30

別の方法ですが無事進めたようで良かったです。 断片的な質問には答えられるのですが全体像や今後の実装内容までは判らないので中々的確なアドバイス出来なくて申し訳ないです。 制作規模が中々大きい感じですが体調崩さない程度のワークバランスで頑張って欲しいです。
guest

0

Sas.isA() が、必殺技アイテムのスクリプトに含まれる public bool isA=false; のことを指しているのでしたら、 () を外して _isA=Sas.isA; とすれば解決するはずです。

エラー文は、本来は変数であるはずの isA をまちがえて関数として扱っているために起こっているエラーです。
もし関数として扱うのでしたら、 _isA=Sas.isA(); の部分をそのままに以下のようにすればいい感じになります。

C#

1//必殺技アイテムのスクリプト 2 3 Public bool isA(){ 4 bool result=false; 5 return result; 6 } 7 8 9 private void OnCollisionEnter2D(Collision2D collision){/*省略*/} 10 IEnumerator CI_A(){/*省略*/}

投稿2020/02/23 17:36

kaitorisenkou

総合スコア28

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

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

Kageyama_23457

2020/02/23 23:46

kaitorisenkou様 ご教授ありがとうございます。ですが、以下のエラーが出てしまいました。 "CS0428: Cannot convert method group 'isA' to non-delegate type 'bool'. Did you intend to invoke the method?" ざっくり和訳で「isAを非デリゲード型のboolに変換できません」ということで合っていますでしょうか。 デリゲード型うんぬんについては http://csharp30matome.seesaa.net/article/129993518.html こちらのページを発見はしているのですが、自分のスクリプトのどこにどうねじこめばいいのかがわかりません。もしよろしければご教授頂きたく存じます。
kaitorisenkou

2020/02/24 02:34

今度は逆に関数をまちがえて変数として扱っているために発生したエラーですね。 この質問で挙げられている場所以外で isA を操作する箇所が存在するのでしょうか?でしたら必殺技アイテムのスクリプトを元に戻して、小さくされるキャラのスクリプトだけを修正するようにしてください。
Kageyama_23457

2020/02/24 08:36

お教え頂いた通り、小さくされるキャラのスクリプトだけ修正しましたが、今度は以下のエラーが出ました。 Object reference not set to an instance of an object ↓この行に対して出るので、 SAprefab Sas=SA.GetComponent<SAprefab>(); ゲームを実行する前には場に存在していない必殺技アイテム(実行後プレハブで量産)を取得しようとしているから出ているのかと思いますが合っていますでしょうか。 実行後プレハブで量産されるオブジェクトのスクリプトの取得方法について検索していますが、「プレハブ スクリプト 取得」などと検索してもプレハブの生成方法ばかり出てきます。 申し訳ございませんが、もし方法をご存知でしたらご教授頂けませんでしょうか。
kaitorisenkou

2020/02/24 10:13

・そのSAというオブジェクトに「SAprefab」がアタッチされていない ・SAが存在していない どちらかが考えられます。
Kageyama_23457

2020/02/24 11:38

質問欄にも反映させましたが、 必殺技アイテム(SA)はインスペクタで取得させました。 結果、Object reference not set to an instance of an objectも他のエラーも出なくなりましたが、依然両スクリプトのboolは繋がっていないと思われます。
Kageyama_23457

2020/02/25 01:52

kaitorisenkou様 タイトル、内容ともに更に書き換えました。書いた通りですが、インスペクタで強制的にisAをtrueにすると_isAもtrueになりますが、ゲーム実行上ではうまく動作しません。
Kageyama_23457

2020/02/26 00:21

質問欄に反映させた通りですが、解決しました。 今回は結局staticを使うことにしましたが、「staticではまずいが、参照先はプレハブではない」という状況でお教え頂いた記述を使うことがあるかもしれません。ご教授ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問