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

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

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

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

Q&A

解決済

1回答

1660閲覧

Unity2D(C#)ボードゲームの様に決められたマスをタップするとキャラが進む

masayuki07

総合スコア51

C#

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

0グッド

0クリップ

投稿2021/02/02 03:00

編集2021/02/02 04:50

前提・実現したい事

前回Unity2D(C#)で画面をクリックしたら、Shape2Dの色を順番に変える方法にて質問をさせて頂いたのですが、
更に色を変更すると同時に一緒にキャラクターを出現させて移動させたいのですが上手くいきません。
考えているのが、色を変える時にInstantiateでキャラを生成しよと思うのですが、エラーが出ます。

追記
キャラを生成する際に1つずつ生成をしたいです。

やりたい事

エラー内容

/Test/Assets/Script/NewBehaviourScript.cs(38,38): Error CS1061: 'Shape' に 'kyara' の定義が含まれておらず、型 'Shape' の最初の引数を受け付けるアクセス可能な拡張メソッド 'kyara' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。 (CS1061)

試したこと

現在のNewBehaviourScript.csで生成するのでは無く、Shape.csの方でGameobjectを指定して生成しようとしたのですが、
publicや[SerializeField]を付けてもインスペクター上に表示されません。
そこで直接コードで指定
public Object kyara = GameObject.Find("ファイル名");
とやっても駄目でした。
UnityのInspectorで変数を表示する方法まとめ
も参考にしました。

shape.cs
アセットを使っています。

前回と似た内容で申し訳ありません。
的外れな見解かもしれませんが、解決方法、その他の方法がありましたら、お力添えよろしくお願いします。
shape.csは文字制限で記載できませんでした。

該当コード

NewBehaviourScript.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Shapes2D; 5 6public class NewBehaviourScript : MonoBehaviour 7{ 8 public static NewBehaviourScript instance; 9 10 11 12 public Shape[] shapes; 13 public float time = 0; 14 public GameObject kyara; //動かしたいキャラクター 15 16 17 18 // 何番のシェイプを赤色にするかを示すインデックス 19 public int activeShapeIndex = -1; 20 21 22 private void Awake() 23 { 24 instance = this; 25 } 26 27 28 29 30 void Update() 31 { 32 33 34 if (Input.GetMouseButtonDown(0)) 35 { 36 37 38 time = 0; 39 40 // クリックのたびにactiveShapeIndexを次に進む 41 activeShapeIndex++; 42 43 44 45 // shapesの個数で割った余りをとる 46 activeShapeIndex %= shapes.Length; 47 48 // activeShapeIndex番目のシェイプは赤に、それ以外は白に切り替える 49 for (var i = 0; i < shapes.Length; i++) 50 { 51 52 53 shapes[i].settings.fillColor = i == activeShapeIndex ? Color.yellow : Color.white; 54 55          'エラー箇所 56 //キャラを生成する 57 Instantiate(shapes[i].kyara, transform.position, transform.rotation);' 58 59 } 60 61 } 62 63} 64 65 66

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

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

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

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

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

guest

回答1

0

ベストアンサー

kyaraが存在するのは、ShapeではなくNewBehaviourScriptです。
当然ながら、「Shapeのkyara」なんてものは存在しないわけですが、あなたのコードではそれを取得しようとしています。

また、この内容だとマスではなく、NewBehaviourScriptの位置に生成されてしまいます。
Instantiate(kyara, shapes[i].transform.position, shapes[i].transform.rotation);
が正しいと思いますがどうでしょう。

publicや[SerializeField]を付けてもインスペクター上に表示されません。

これはShapeのインスペクターがエディタ用のスクリプトで変更されているためで、そちらも変更しないと表示させることはできません。
また、そもそも第三者が作ったものを変更するのは、できる限り避けたほうがいいので、今のように別々のスクリプトにした構成のほうがいいでしょう。

投稿2021/02/02 03:47

編集2021/02/02 03:57
fiveHundred

総合スコア10152

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

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

masayuki07

2021/02/02 04:36

ご回答ありがとうございます。とても参考になります。 Instantiate(kyara, shapes[i].transform.position, shapes[i].transform.rotation);で生成されました。 しかし一回のクリックで全てのマスに生成されてしまいます。 一つずつ生成、処理したいのですが 色を変更する際は for (var i = 0; i < shapes.Length; i++) { shapes[i].settings.fillColor = i == activeShapeIndex ? Color.yellow : Color.white; の部分で処理してると思うのですが、 Instantiate(kyara, shapes[i].transform.position, shapes[i].transform.rotation); にどの様に変更を加えたら一つずつ生成できるでしょうか? 一つ生成する度に Destroy(gameObject) 等でオブジェクトを削除すれば良いのでしょうか? 最初から質問を明確にしていなくて、申し訳ありません。
fiveHundred

2021/02/02 08:13

それを言うなら、for文の中で生成するのではなく、for文の外で「Instantiate(kyara, shapes[activeShapeIndex].transform.position, shapes[activeShapeIndex].transform.rotation);」と生成すればよろしいかと思います。 この場合、移動する度に前のキャラが残ってしまうので、それは毎回削除するか、生成ではなく移動するようにしてください。
退会済みユーザー

退会済みユーザー

2021/02/03 08:06

新しく生成するっていうのが本当にしたい動作なんですかね?ってのが気になりました。 生成するって事は全てのkyaraは別の存在って事になりますので、それが本当に望む動作なんでしょうか、、、?表示だけなら問題ないでしょうが中身を考えるとどうなんだろう、、、?
masayuki07

2021/02/04 13:39 編集

ご回答ありがとうございます。 生成するオブジェクトとそれを格納するオブジェクトを別にして、生成する場所を指定し、生成するコードをfor文の外で上手く出来ました。 public GameObject[] kyara; //生成したキャラクターを格納する public GameObject kyara2;//生成したいキャラクター public int activeShapeIndex = -1;//シェイプの位置 public int activeShapeIndex2 = -2;シェイプ−1をする事で一つ目の位置を削除する kyara[activeShapeIndex] = Instantiate(kyara2, shapes[activeShapeIndex].transform.position, shapes[activeShapeIndex].transform.rotation); if (activeShapeIndex2 > -1) { Destroy(kyara[activeShapeIndex2]); } 視覚的に表示されてれば目的は達成されているので大丈夫です。 今後知識が深まったらキャラ自体を動かす方法も考えてみたいと思います。 皆様本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問