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

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

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

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

Unity

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

Q&A

2回答

798閲覧

ユニティの別のオブジェにメッセージを送りたい

syougakusei

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2023/01/11 11:24

編集2023/01/11 11:34

前提

unityでRPGを作っていてエラーが発生しました

実現したいこと

  • a というオブジェクトに触れたときにwallのタグに信号を送りたい

発生している問題・エラーメッセージ

error CS0120: An object reference is required for the non-static field, method, or property 'Component.SendMessage(string)'

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Threading.Tasks; 5 6public class battle : MonoBehaviour 7{ 8//敵のステータスの変数を宣言する 9int enemyHP;//敵の最初のHP 10int enemydefense;//敵の防御力 11int enemyHP3;//敵の残りのHP 12int enemydamage;//敵のダメージ 13//自分のステータスの変数を宣言する 14int myHP;//自分のHP 15int myHP2;//自分の残りのHP 16int mylevel;//自分のレベル 17int damage;//自分のダメージ 18int defense;//自分の防御力 19int myhealing;//自分の回復 20double myexp;//自分の経験値レベルが上がったらリセットされる 21double myexp2;//自分がレベルアップするまでの残りの経験値 22double myexp3;//獲得した経験値 23double myexp4;//レベルが上がるまでの経験値レベルが上がったら自分のレベル * 10 / 8でリセットされる 24//自分と敵どちらにも関係しないもの 25int clear;//敵を倒せたかどうか 26int ok;//自分の攻撃と相手の攻撃が終わるまでokが1にならない 27private string objName; 28public float speed = 2.1f; 29void Start() 30{ 31//初期設定 32enemyHP = Random.Range(10, 21);//敵の体力を10~21にする 33clear = 0;//まだ敵を倒せていないし自分が死んでもないので0のまま 34enemyHP3 = enemyHP; 35myHP = 100; 36myHP2 = myHP; 37mylevel = 1; 38myexp = 0; 39myexp2 = mylevel + 10 / 0.8; 40myexp3 = 0; 41myexp4 = myexp2; 42ok = 1; 43myhealing = 0; 44Debug.Log("敵のHPは" + enemyHP + "だよ"); 45 46} 47 48async void OnCollisionEnter(Collision collision) 49 { 50 if (collision.gameObject.name == "a") 51 { 52 if (ok == 1) 53 { 54 ok = 0; 55 if (clear > 0) 56 { 57 enemyHP = Random.Range(10, 20);//敵の体力を3~5にする 58 Debug.Log("敵のHPは" + enemyHP + "だよ"); 59 damage = Random.Range(1 + mylevel, 11 + mylevel);//自分の攻撃力を1~10にする 60 enemydefense = Random.Range(1, 6);//敵の防御力を1~5にする 61 enemyHP3 = enemyHP; 62 clear = 0; 63 myHP = 99 + mylevel; 64 myHP2 = myHP; 65 myexp2 = mylevel + 10 / 0.8; 66 myexp4 = myexp2; 67 } 68 if (clear > 1) 69 { 70mylevel = 1; 71enemyHP = Random.Range(10, 20);//敵の体力を3~5にする 72Debug.Log("敵のHPは" + enemyHP + "だよ"); 73 damage = Random.Range(1 + mylevel, 11 + mylevel);//自分の攻撃力を1~10にする 74 enemydefense = Random.Range(1, 6);//敵の防御力を1~5にする 75 enemyHP3 = enemyHP; 76 clear = 0;//敵を倒すか死ぬかの判定1が敵を倒した2が敵に殺された 77 myHP = 99 + mylevel;//自分のHPを5にしてレベルが上がるごとにHPが増える 78 myHP2 = myHP; 79 myexp2 = mylevel + 10 / 0.8; 80 myexp4 = myexp2; 81 } 82 transform.position = new Vector3(0, 1, -4); 83 GameObject[] block = GameObject.FindGameObjectsWithTag ("wall"); 84wall.SendMessage("hogehogeMessage"); 85 damage = Random.Range(1 + mylevel, 11 + mylevel);//自分の攻撃力を1~10にする 86 enemydefense = Random.Range(1, 6);//敵の防御力を1~5にする 87enemyHP = enemyHP3; 88Debug.Log("自分の攻撃!"); 89await Task.Delay(1000); 90if (damage > enemydefense)//もし敵の防御力よりも自分の攻撃力のほうが強いなら 91{ 92Debug.Log (damage - enemydefense + "ダメージ与えられました");//自分のダメージ-敵の防御力分のダメージを与える 93await Task.Delay(1000); 94} 95else if (damage == enemydefense)//もし敵の防御力と自分の攻撃力が同じなら 96{ 97Debug.Log ("まずい攻撃が防がれてしまった!");//敵の防御力と自分の攻撃力が同じなためダメージがどちらにも入らないから攻撃が防がれる 98await Task.Delay(1000); 99} 100else //上のどちらでもないなら 101{ 102int mydamage = enemydefense - damage;//自分に当たるダメージをひとまとめにする 103Debug.Log ("自分の攻撃力よりも相手の防御力のほうが高くて<color=red><size=28>" + mydamage + "ダメージ</size></color>くらってしまった");//敵の防御力-自分の攻撃力分のダメージを受ける 104await Task.Delay(1000); 105myHP2 = myHP2 - mydamage; 106if (myHP2 < 1) 107{ 108clear = 2; 109Debug.Log("<color=red><size=28><b>まずい死んでしまった</b></size></color>"); 110Debug.Log("<color=red><size=28><b>死んでしまったのでレベルがリセットされてしまった</b></size></color>"); 111} 112else 113{ 114Debug.Log("残りの自分の<color=green><size=28>HP</size></color>は<color=green><size=28>" + myHP2 + "</size></color>残ってます"); 115} 116await Task.Delay(1000); 117} 118int enemyHP2 = enemyHP;//これはただ分身を作るだけ 119int damage2 = damage - enemydefense; 120if (damage2 > 0) 121{ 122enemyHP3 = enemyHP2 - damage2;//こっちは、敵の残りのHPを求めている 123} 124else 125{ 126enemyHP3 = enemyHP2; 127} 128if (enemyHP3 < 1)//もし自分が与えた攻撃力で、敵のHPより上か同じだったら 129{ 130Debug.Log ("<color=red>敵を倒せました</color>");//敵のHPがなくなるから倒せる 131myexp3 = Random.Range(3, 6); 132myexp = myexp + myexp3; 133Debug.Log("敵を倒して" + myexp3 + "経験値を獲得した"); 134if (myexp >= mylevel + 10 / 0.8) 135{ 136myexp4 = mylevel + 10 / 0.8; 137myexp = myexp - myexp4; 138Debug.Log(myexp); 139mylevel++; 140Debug.Log("やったー自分のレベルが1あがって<color=blue><size=28>level" + mylevel + "</size></color>になった"); 141Debug.Log("攻撃力と体力と防御力が一上がったよ"); 142myexp2 = mylevel + 10 / 0.8 - myexp; 143Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 144clear = 1; 145ok = 1; 146} 147else{ 148myexp2 = mylevel + 10 / 0.8 - myexp; 149 150 151Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 152clear = 1; 153ok = 1; 154} 155 156 157} 158else//上のに当てはまらないなら 159{ 160Debug.Log ("あと敵のHPは" + enemyHP3 + "残っています" );//あと残り敵のHPはもう求めたからあとはそれを表示させる 161await Task.Delay(1000); 162enemydamage = Random.Range(3, 10);//敵の攻撃力を3~7にする 163defense = Random.Range(2 + mylevel, 6 + mylevel);//自分の防御力を2~5にする 164Debug.Log("敵の攻撃!"); 165await Task.Delay(1000); 166if (enemydamage > defense)//もし敵の防御力よりも自分の攻撃力のほうが強いなら 167{ 168int mydamage = enemydamage - defense; 169Debug.Log ("<color=red><size=28>" + mydamage + "ダメージ</size></color>受けました");//敵のダメージ-自分の防御力分のダメージを与える 170await Task.Delay(1000); 171myHP2 = myHP2 - mydamage; 172if (myHP2 < 1) 173{ 174clear = 2; 175Debug.Log("<color=red><size=28><b>まずい死んでしまった</b></size></color>"); 176Debug.Log("<color=red><size=28><b>死んでしまったのでレベルがリセットされてしまった</b></size></color>"); 177} 178else 179{ 180Debug.Log("残りの自分の<color=green><size=28>HP</size></color>は<color=green><size=28>" + myHP2 + "</size></color>残ってます"); 181} 182await Task.Delay(1000); 183ok = 1; 184} 185else if (damage == enemydefense)//もし自分の防御力と敵の攻撃力が同じなら 186{ 187Debug.Log ("やったー攻撃を防げたぞ!");//自分の防御力と敵の攻撃力が同じなためダメージがどちらにも入らないから攻撃が防がれる 188await Task.Delay(1000); 189ok = 1; 190} 191else 192{ 193int enemydamage1 = defense - enemydamage;//自分に当たるダメージをひとまとめにする 194Debug.Log ("敵の攻撃力よりも自分の防御力のほうが高くて相手に<color=red><size=28>" + enemydamage1 + "ダメージ</size></color>を与えた");//自分の防御力-敵の攻撃力分のダメージを受ける 195await Task.Delay(1000); 196enemyHP3 = enemyHP3 - enemydamage1; 197if (enemyHP3 < 1)//もし自分が与えた攻撃力で、敵のHPより上か同じだったら 198{ 199Debug.Log ("<color=red>敵を倒せました</color>");//敵のHPがなくなるから倒せる 200myexp3 = Random.Range(3, 6); 201myexp = myexp + myexp3; 202Debug.Log("敵を倒して" + myexp3 + "経験値を獲得した"); 203if (myexp >= mylevel + 10 / 0.8) 204{ 205myexp4 = mylevel + 10 / 0.8; 206myexp = myexp - myexp4; 207Debug.Log(myexp); 208mylevel++; 209Debug.Log("やったー自分のレベルが1あがって<color=blue><size=28>level" + mylevel + "</size></color>になった"); 210Debug.Log("攻撃力と体力と防御力が一上がったよ"); 211myexp2 = mylevel + 10 / 0.8 - myexp; 212Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 213clear = 1; 214ok = 1; 215} 216else{ 217myexp2 = mylevel + 10 / 0.8 - myexp; 218 219 220Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 221clear = 1; 222ok = 1; 223} 224 225 226} 227else//上のに当てはまらないなら 228{ 229Debug.Log ("あと敵のHPは" + enemyHP3 + "残っています" );//あと残り敵のHPはもう求めたからあとはそれを表示させる 230await Task.Delay(1000); 231ok = 1; 232} 233} 234} 235} 236} 237else if (collision.gameObject.name == "healing") 238 { 239 if (ok == 1) 240 { 241 ok = 0; 242 if (clear > 0) 243 { 244 enemyHP = Random.Range(10, 20);//敵の体力を3~5にする 245 Debug.Log("敵のHPは" + enemyHP + "だよ"); 246 damage = Random.Range(1 + mylevel, 11 + mylevel);//自分の攻撃力を1~10にする 247 enemydefense = Random.Range(1, 6);//敵の防御力を1~5にする 248 enemyHP3 = enemyHP; 249 clear = 0; 250 myHP = 99 + mylevel; 251 myHP2 = myHP; 252 myexp2 = mylevel + 10 / 0.8; 253 myexp4 = myexp2; 254 } 255 if (clear > 1) 256 { 257mylevel = 1; 258enemyHP = Random.Range(10, 20);//敵の体力を3~5にする 259Debug.Log("敵のHPは" + enemyHP + "だよ"); 260 damage = Random.Range(1 + mylevel, 11 + mylevel);//自分の攻撃力を1~10にする 261 enemydefense = Random.Range(1, 6);//敵の防御力を1~5にする 262 enemyHP3 = enemyHP; 263 clear = 0;//敵を倒すか死ぬかの判定1が敵を倒した2が敵に殺された 264 myHP = 99 + mylevel;//自分のHPを5にしてレベルが上がるごとにHPが増える 265 myHP2 = myHP; 266 myexp2 = mylevel + 10 / 0.8; 267 myexp4 = myexp2; 268 } 269 transform.position = new Vector3(0, 1, -4); 270 myhealing = Random.Range(1, 5); 271 myHP2 = myHP2 + myhealing; 272 Debug.Log("自分のHPが" + myhealing + "増えてHPが" + myHP2 + "になった"); 273 enemydamage = Random.Range(3, 10);//敵の攻撃力を3~7にする 274defense = Random.Range(2 + mylevel, 6 + mylevel);//自分の防御力を2~5にする 275Debug.Log("敵の攻撃!"); 276await Task.Delay(1000); 277if (enemydamage > defense)//もし敵の防御力よりも自分の攻撃力のほうが強いなら 278{ 279int mydamage = enemydamage - defense; 280Debug.Log ("<color=red><size=28>" + mydamage + "ダメージ</size></color>受けました");//敵のダメージ-自分の防御力分のダメージを与える 281await Task.Delay(1000); 282myHP2 = myHP2 - mydamage; 283if (myHP2 < 1) 284{ 285clear = 2; 286Debug.Log("<color=red><size=28><b>まずい死んでしまった</b></size></color>"); 287Debug.Log("<color=red><size=28><b>死んでしまったのでレベルがリセットされてしまった</b></size></color>"); 288} 289else 290{ 291Debug.Log("残りの自分の<color=green><size=28>HP</size></color>は<color=green><size=28>" + myHP2 + "</size></color>残ってます"); 292} 293await Task.Delay(1000); 294ok = 1; 295} 296else if (damage == enemydefense)//もし自分の防御力と敵の攻撃力が同じなら 297{ 298Debug.Log ("やったー攻撃を防げたぞ!");//自分の防御力と敵の攻撃力が同じなためダメージがどちらにも入らないから攻撃が防がれる 299await Task.Delay(1000); 300ok = 1; 301} 302else 303{ 304int enemydamage1 = defense - enemydamage;//自分に当たるダメージをひとまとめにする 305Debug.Log ("敵の攻撃力よりも自分の防御力のほうが高くて相手に<color=red><size=28>" + enemydamage1 + "ダメージ</size></color>を与えた");//自分の防御力-敵の攻撃力分のダメージを受ける 306await Task.Delay(1000); 307enemyHP3 = enemyHP3 - enemydamage1; 308if (enemyHP3 < 1)//もし自分が与えた攻撃力で、敵のHPより上か同じだったら 309{ 310Debug.Log ("<color=red>敵を倒せました</color>");//敵のHPがなくなるから倒せる 311myexp3 = Random.Range(3, 6); 312myexp = myexp + myexp3; 313Debug.Log("敵を倒して" + myexp3 + "経験値を獲得した"); 314if (myexp >= mylevel + 10 / 0.8) 315{ 316myexp4 = mylevel + 10 / 0.8; 317myexp = myexp - myexp4; 318Debug.Log(myexp); 319mylevel++; 320Debug.Log("やったー自分のレベルが1あがって<color=blue><size=28>level" + mylevel + "</size></color>になった"); 321Debug.Log("攻撃力と体力と防御力が一上がったよ"); 322myexp2 = mylevel + 10 / 0.8 - myexp; 323Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 324clear = 1; 325ok = 1; 326} 327else{ 328myexp2 = mylevel + 10 / 0.8 - myexp; 329 330 331Debug.Log("レベルアップするまでの残りの経験値はあと" + myexp2 + "です"); 332clear = 1; 333ok = 1; 334} 335 336 337} 338else//上のに当てはまらないなら 339{ 340Debug.Log ("あと敵のHPは" + enemyHP3 + "残っています" );//あと残り敵のHPはもう求めたからあとはそれを表示させる 341await Task.Delay(1000); 342ok = 1; 343} 344 } 345} 346 347 348 } 349} 350 351}

wall

using System.Collections; using System.Collections.Generic; using UnityEngine; public class wall : MonoBehaviour { void hogehogeMessage() { transform.position = new Vector3(0, 0, 0); } }

試したこと

調べたりして実行したがうまくいかず、そもそもユニティ初心者なのであまり理解ができなかった、いろいろ試したが成果はえられず

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

コードが結構長いので飛ばし飛ばしで見てください。
コードの回答とこれからに生かしたいので解説もお願いしたいです。
unityをはじめで2週間ぐらいです。

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

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

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

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

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

Y0241-N

2023/01/12 01:03

質問内容がかなり分かりにくいので、以下のことを参考に質問を再編集してください。 ・> a というオブジェクトに触れたときにwallのタグに信号を送りたい と書かれていますが、そもそもこの方法自体が分からないのか、実装してみたが上手くいっていないのかがパッと分かりません。理由としては何ができないのか?が不足しており、エラーメッセージしか掲載されていないことと、提示されているスクリプトが全文であり、質問に関係のない部分が多く、エラー箇所が分かりにくいためです。 なので、質問に関係しない部分は省きましょう。また、コードは正しくインデントしてください、非常に見辛いため読解するのが面倒に感じられると、回答率が下がる要因になります。
guest

回答2

0

コード全体を読めていませんが、83,84行目について

GameObject[] block = GameObject.FindGameObjectsWithTag ("wall"); wall.SendMessage("hogehogeMessage");

84行目の wall インスタンスはどこから来たものでしょうか?その前のコードを検索しても定義が見つかりません。

もしかして、83行目でwallタグが付加されたゲームオブジェクトをblock配列に入れていますが、この配列内のオブジェクトを利用するつもりでしょうか。
blockは配列になっているので、for文などでそれぞれのオブジェクトを取り出して関数を呼び出す必要があります。

GameObject[] block = GameObject.FindGameObjectsWithTag ("wall"); foreach(obj in block) { obj.SendMessage("hogehogeMessage"); }

また、質問へのコメントもありますが、正しくインデントしましょう。
コードをきれいに書くことで、コードを読む人(回答者や未来の自分)に対する心遣いになります。無駄な勘違いを防ぐこともできます。

例えば、配列なのにblockという変数を使うと勘違いしやすくなります。blocksだと複数あるように思えます。

GameObject[] blocks = GameObject.FindGameObjectsWithTag ("wall"); foreach(block in blocks) { block.SendMessage("hogehogeMessage"); }

あと、言語によって推奨される作法は様々ですが、C#の場合はクラス名はパスカルケースで記述しておいた方が良いかもしれません。
Wallクラスのwallインスタンスという形で、ぱっと見でクラスなのかインスタンスなのか多少なりとも分かりやすくなると思います。

下記のサイトをぜひ読んでみてください。
インデントとは?インデントの目的は?インデントを使いこなして見やすいソースコードを書こう!
脱・読みづらいコード!今日から一段上のプログラマーになる方法 5 選
C# のコーディング規則

投稿2023/01/12 10:38

Kapustin

総合スコア1186

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

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

0

エラーメッセージからerror CS0120: An object reference is required for the non-static で検索したら下記にたどり着きました
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs0120
「静的でないフィールド、メソッド、またはプロパティを使用するには、まずオブジェクト インスタンスを作成する必要があります。」と解説があります。
該当のソースコード84行目にwallがnew されずに出てきているのが原因かと予想しました。
どこか適切なところでnewを入れる必要があるんじゃないかと。

csharp

1wall = new wall();

投稿2023/01/11 14:26

odataiki

総合スコア938

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

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

YAmaGNZ

2023/01/11 15:13

wallクラスはMonoBehaviourを継承してるのでnewすべきではないと思います。
syougakusei

2023/01/12 08:41

入れたらエラーがさらに起きたんですけどどうしたらいいですか
syougakusei

2023/01/12 09:43

入れたところは83行目と84行目の間です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問