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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Unity

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

Q&A

解決済

1回答

1820閲覧

レイにヒットしたレイヤーによってシーン先でプレファブをインスタンス化したい

saAsectron36

総合スコア27

Unity

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

0グッド

0クリップ

投稿2017/12/02 03:23

編集2017/12/04 07:47

敵をクリックしたらシーンに移動し、移動先でクリックした敵のプレファブをインスタンス化したいのですが、
上手くいきません。
コードではレイにヒットしたレイヤータグによってif文で分けて、それぞれにstaticで区別値を挿入してシーン間で橋渡ししようとしてます。
シーン移動先のENEMシーン, Controller.csでは区別値によってインスタンス化する敵を分けようとしていますが、
上手く橋渡しができません。呼出元か呼出先の書き方が間違っているのでしょうか?
それと本当に遷移先でインスタンス化ができるのか不安も残ってます。
少々複雑ですが、お助けの程よろしくお願いします。

//MONSシーン,GameManager.cs public string EnemyLayerName = "Enemy"; //レイヤータグ代入 public string EnemyLayerName1 = "Enemy1"; //レイヤータグ代入 //レイの設定 public bool RegisterHitGameObject(PointerEventData data) { int mask = BuildLayerMask(); //レイヤーマスク代入 int mask1 = BuildLayerMask1(); //レイヤーマスク代入 Ray ray = Camera.main.ScreenPointToRay(data.position); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity, mask)) { var go = hitInfo.collider.gameObject; int i = hitpoint; //区別値 ※質問時のinstantからiに編集されています getHitPoint(i); //区別値 ※質問時のinstantからiに編集されています HandleHitGameObject(go); //シーン制御へ return true; } else if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity, mask1)) { print("Object hit " + hitInfo.collider.gameObject.name); var go = hitInfo.collider.gameObject;         int i = hitpoint1; //区別値1 ※質問時のinstant1からiに編集されています getHitPoint1(i); //区別値1 ※質問時のinstant1からiに編集されています HandleHitGameObject(go); //シーン制御へ return true; } return false; } //区別値 private static int hitpoint = 0; //※質問時のpublicからprivateに編集されています public static int getHitPoint(int i) //このメンバ変数を渡す { return i; } //区別値1 private static int hitpoint1 = 1; //※質問時のpublicからprivateに編集されています public static int getHitPoint1(int i) //このメンバ変数を渡す { return i; } //シーン制御 private void HandleHitGameObject(GameObject go) { if(go.GetComponent<Enemy>()!= null) { if (EnemyScene == null ) { SceneManager.LoadSceneAsync(EnemySceneName, LoadSceneMode.Additive); } } //レイヤーマスク決定 private int BuildLayerMask() { return 1 << LayerMask.NameToLayer(EnemyLayerName); } private int BuildLayerMask1() { return 1 << LayerMask.NameToLayer(EnemyLayerName1); } //ENEMシーン, Controller.cs public GameObject enemyPrefab; public GameObject enemyPrefab1; int resulthit = GameManager.getHitPoint(i); //受け取る エラー ※.getHitPoint();から.getHitPoint(i)に編集されています int resulthit1 = GameManager.getHitPoint1(i); //受け取る エラー ※.getHitPoint1();から.getHitPoint1(i)に編集されています // Use this for initialization void Start () { int resulthit = GameManager.getHitPoint(); //エラー int resulthit1 = GameManager.getHitPoint1(); //エラー } private void Enemy() { if(resulthit == 0) { Instantiate(enemyPrefab); } else if(resulthit1 == 1) { Instantiate(enemyPrefab1); } } //エラー内容 現在のコンテキストに'i'という名前は存在しません。 現在のコンテキストに'i'という名前は存在しません。 現在のコンテキストに'result'という名前は存在しません。 現在のコンテキストに'result1'という名前は存在しません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

public static int getHitPoint(int instant) {}と定義されていますので、
呼び出し側もGameManager.getHitPoint (i);とする必要があります。(iはint型)
(以降getHitPoint1メソッドも同様)

getHitPointメソッドは「instantを受け取り、instantを0にし、instantを返す」という処理になっていますが恐らく間違いですよね?
この挙動だとsetterとしての挙動が正しいので、命名も見直すべきかと思います。

余談ですが、static publicな変数は直接int resulthit = GameManager.hitpoint;のような形で呼び出せます。
getter/setterを使うならstatic privateにした方がいいかと思います。


2017/12/03 13:15 コメントを受けて追記

諸々根本的に思い違いされていそうです。
int型はstaticかそうでないかに関わらず値参照です。現状のコードは以下のような意味になります。

C#

1int i = hitpoint; //iにhitpointの値を入れる(hitpointの参照が渡されているわけではない)……※ 2getHitPoint(i); //getHitPointにiの値を渡す(iの参照が渡されているわけでない) 3public static int getHitPoint(int i) //iに入った値を受け取る。※のiとは全く別の変数である 4{ 5 return i; //渡された値をそのまま返す(getHitPointとも、※のiとも無関係) 6}

「参照が渡されているわけではない」というのは、例えば

C#

1hitpoint = 0; //hitpoint=0、iは未定義 2int i = hitpoint; //hitpoint=0、i=0 3hitpoint = 1; //hitpoint=1、i=0

という意味です。(最後の処理でi=1にはならない)

恐らくこうしたいのではないか、というソースを書くとすると以下になります。

C#

1//GameManager.cs 2private static int hitpoint = 0; 3public static int getHitPoint() 4{ 5 return hitpoint; 6} 7public static void setHitPoint(int i) 8{ 9 hitpoint = i; //敢えてsetter作りましたが、特に複雑な処理をしないなら直接代入してもいいかと思います。 10} 11//セットする部分 12setHitPoint(0); //そもそも区別値はどこから設定するのか不明なのでとりあえずこうしています。 13 14//Controller.cs 15int resulthit = GameManager.getHitPoint();

なお、質問文のソースが編集されていますが、最初の回答と噛み合わなくなってしまうので、
編集前の内容を残すか追記として書いてくださると後から見た人の参考になりやすいです。

投稿2017/12/02 05:07

編集2017/12/03 04:15
sakura_hana

総合スコア11427

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

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

saAsectron36

2017/12/02 10:45

ご回答ありがとうございます。他に尋ねる宛てもなく、大変助かっています。 しかし下記のように修正してみたのですが、ビルドで呼び出しの方でつまづいてしましました。 int i = hitpoint; //区別値 getHitPoint(i); //区別値 private static int hitpoint = 0; public static int getHitPoint(int i) //呼び出し元 { return i; } //呼び出し int resulthit = GameManager.getHitPoint(i); ←エラー エラーコード:現在のコンテキストに'i'という名前は存在しません
sakura_hana

2017/12/03 04:15

回答欄に追記しました。
saAsectron36

2017/12/04 03:53

ご回答ありがとうございました。この書き方ではif文の中の値が参照されるわけではないということに気付きました。参照できる方法をもっと分かりやすい形の文で質問し直したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問