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

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

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

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

Unity

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

Q&A

解決済

2回答

1664閲覧

あるフィールドの値を引数として違うクラスに渡したい

dedede914

総合スコア63

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/21 02:16

編集2020/06/21 02:19

前提・実現したいこと

punch1クラスで定義したdamagePowerをpunchmanagerクラスに渡したい

あるクラスのフィールドで定義した整数を持つ変数を、
そのクラス内のメゾッドの引数として他のクラスのメゾッドに受け渡したいです

言葉が間違ってるかと思います、すみません

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

error CS0176: Member 'punch1.damagePower' cannot be accessed with an instance reference; qualify it with a type name instead もしくは

該当のソースコード

C#

1public class punch1 : MonoBehaviour 2{ 3 public static int damagePower= 1;  //この数値 4 public void OnTriggerEnter2D(Collider2D collision) 5 { 6 if (collision.tag == "Enemy") 7 { 8 var dp = new punch1(); //ここらへんが問題 9 punchmanager.damagetrigger(dp.damagePower,collision);//punchmanagerクラスにdamagePowerを渡したい 10 } 11 } 12} 13 14 15 16public class punchmanager : MonoBehaviour 17{ 18 public void damagetrigger(int damagePower, Collider2D collision) 19 { 20 enemymanager enemy = collision.GetComponent<enemymanager>(); 21 enemy.OnDamage(damagePower); 22 } 23}

試したこと

staticで定義もしてみました

public static int damagePower=1; if (collision.tag == "Enemy") { punchmanager.damagetrigger(punch1.damagePower,collision);//punchmanagerクラスにdamagePowerを渡したい }

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

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

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

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

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

patapi

2020/06/21 02:48 編集

「staticで定義したとき」のコードを実行するとどのようなエラーが出るのでしょうか?(上と全く同じエラー?それとも「An object reference is required for the nonstatic field, method, or property 'member'」というようなエラー?) またはエラーが出ないのでしょうか?
Q71

2020/06/21 03:35

C#はobject oriented languageです。orientedは「指向」と訳されますが、日本語の意味では「志向」が正解です。 object は「何か」「オブジェクト」と訳される場合が多いですが、「目的」という意味もあります。「目的志向言語」、目的を考えてそれに至る方法をかんがえる(プログラミング)言語であると考えてください。 ということで、変数やメソッドそれぞれの目的はなんでしょうか。damagePowerは何を表す変数で、その値はクラスに属するのか、インスタンスごとに異なるのか。そういう事を考えてください。そうすると、クラスメンバーの整理ができます。 まず、クラスメンバーの整理が必要だと思いました。
guest

回答2

0

ベストアンサー

  • damagePowerはstaticなので、クラス名でアクセスする必要があります。
  • punchmanager.damagetrigger(クラス名.メソッド)という記述を行う場合、damagetriggerはstaticメソッドにする必要があります。
public class punch1 : MonoBehaviour { public static int damagePower= 1;  //この数値 public void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == "Enemy") { // damagePowerはstaticなので、クラス名(punch1)でアクセスする必要があります。 punchmanager.damagetrigger(punch1.damagePower,collision);//punchmanagerクラスにdamagePowerを渡したい } } } public class punchmanager : MonoBehaviour { // 上記のようにpunchmanager.damagetriggerという記述を行う場合、damagetriggerはstatic関数にする必要があります。 public void static damagetrigger(int damagePower, Collider2D collision) { enemymanager enemy = collision.GetComponent<enemymanager>(); enemy.OnDamage(damagePower); } }

投稿2020/06/21 02:52

編集2020/06/21 02:55
patapi

総合スコア820

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

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

0

現在提示されているコードだと、public static int damagePower= 1;とstatic付きで宣言されているので、これは静的フィールド(クラスフィールド)ですよね。静的フィールドをインスタンス名(ここではdp)に付けて使おうとすると、提示されているエラーメッセージが表示されます。

解決策は、クラス名に付けてフィールド名を書くpunch1.damamePowerなんですが、すでにご自分で書かれていますね。

もしかして、(質問文には書かれていませんが)本当はstaticにしたくないということなんでしょうか。その場合はそれがわかるように質問文を書かないと伝わりません。

投稿2020/06/21 02:37

Daregada

総合スコア11990

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

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

dedede914

2020/06/21 02:47

回答ありがとうございます staticなしで書くとこのエラーが、 error CS0120: An object reference is required for the non-static field, method, or property 'punchmanager.damagetrigger(int, Collider2D)' staticありでインスタンス化せずにpunch1.damamePower とかくと error CS0120: An object reference is required for the non-static field, method, or property 'punch1.damagePower' で同じようにエラーが出てしまいます
Daregada

2020/06/21 03:04

やみくもにエラーをなくすことが目的になってませんか? まず、「damagePower」はインスタンスごとに異なる値を取るのでしょうか、それともこのクラスで統一された値を取るのでしょうか。それによってstaticにするかどうかが決まります。 あと上のエラーは「punchmanager.damagetrigger」に関するエラーなので、そっちをstaticにするか、punchmanagerのインスタンスを作ってそれを代わりに指定するかする必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問