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

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

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

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

Q&A

解決済

1回答

674閲覧

SetActiveで二つ以上あるオブジェクトの切り替えについて

_080808.Yu

総合スコア11

C#

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

0グッド

0クリップ

投稿2019/07/11 18:41

大学の課題でゲームを制作している者です。
一定数のアイテムを取得したら、プレイヤーのキャラクターが進化(変化)するというものをif分岐させて SetActive でキャラクターモデルを差し替えたいのですが、以下のようなエラーコードが出てきてしまい、上手くいきません。どのように改善すべきでしょうか??

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

エラーメッセージ CharaCon.cs(71,13): error CS0103:The name 'Player01' does not exist in the current context CharaCon.cs(77,13): error CS0103:The name 'Player01' does not exist in the current context CharaCon.cs(79,13): error CS0103:The name 'Player02' does not exist in the current context

該当のソースコード

71:Player01.SetActive(false);

77:if (Player01.activeSelf)

79:Player02.SetActive(true);

C#

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class CharaCon : MonoBehaviour
{

public GameObject Wall; public Text countText; private int count; float inputHorizontal; float inputVertical; Rigidbody rb; public float moveSpeed = 3f; // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); count = 0; SetCountText(); GameObject Player01 = GameObject.Find ("C01"); GameObject Player02 = GameObject.Find ("C02"); } // Update is called once per frame void Update() { inputHorizontal = Input.GetAxisRaw("Horizontal"); inputVertical = Input.GetAxisRaw("Vertical"); } void FixedUpdate() { Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; // 方向キーの入力値とカメラの向きから、移動方向を決定 Vector3 moveForward = cameraForward * (inputVertical) + Camera.main.transform.right * inputHorizontal; rb.velocity = moveForward * moveSpeed + new Vector3(0, rb.velocity.y, 0); } void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Item")) { //script.count += 1; other.gameObject.SetActive(false); count = count + 1; SetCountText(); } } void SetCountText() { countText.text = "X" + count.ToString(); if(count >= 3) { Wall.SetActive(false); Player01.SetActive(false); } } void OnDisable() { if (Player01.activeSelf) { Player02.SetActive(true); } }

}

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

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

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

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

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

gentaro

2019/07/11 21:16

課題なら教材ちゃんと読みましょう。 メンバ変数とローカル変数の説明ぐらいは絶対にあるはずです。
_080808.Yu

2019/07/12 00:39

回答ありがとうございます。残念ながら、教材が無い特殊な学校に通っているので、こうして質問を送る手段を選んだのです。
gentaro

2019/07/12 00:43

大学の課題であれば指定教材ぐらいあるのが普通だと思いますが、それが無いなら自分で入門書なりを購入するのが前提になっているのかと思います。(というか普通買うよね) とりあえず「メンバ変数(フィールド変数)」「ローカル変数」「スコープ」あたりのキーワードで調べてください。
_080808.Yu

2019/07/12 02:58

ありがとうございます。貴重なご意見、参考にさせていただきます。
guest

回答1

0

ベストアンサー

Unity側じゃなくてC#側の問題みたいですね。

まずエラーメッセージの読み方を解説すると、does not exist in the current contextは 日本語で 現在のコンテキストには存在しません という約になります。きっと「コンテキスト」の意味がわからないでしょう。

コンテキストとは、スコープ(範囲、区切られた空間)ともいいまして、スコープは基本的に {}(波括弧)で括られた範囲が一つの単位になります。

変数はこのスコープごとにアクセスできる範囲が分けられています。例えば class CharaConのスコープにGameObject Wallが定義されていますが、これはWall.SetActive(false);を呼び出しているのにエラーメッセージがありませんよね。classのスコープに定義された変数はその中にあるメソッド(void SetCountText()など)の中でも利用することができます。

しかし、あるメソッドのスコープに定義された変数は、他のメソッドの中ではスコープが異なるアクセスできません。

つまりvoid Start()メソッドのスコープでPlayer01やPlayer02を定義してしまっているため、他のメソッドのスコープではPlayer01やPlayer02にアクセスできない。という問題だったわけです。

まとめとして、Player01などを他のメソッドからでもアクセスできるようにStartメソッドの外、クラスのメンバー変数(public GameObject Wall;などと同じ要領で書くといいでしょう)としてPlayer01やPlayer02を定義した上で、StartメソッドでPlayer01などに中身を入れることで、Startメソッド以外のメソッドでもPlayer01が使えるようになります。


今の次期このレベルで躓いていて学友にも聞けない状況というのはかなり厳しい状況と思います。C#のテキストを貰っているなら通しで3回は読み込んで、わからないところを単語ごとにノートにまとめていくなどした方がいいと思います。(無ければ本屋で買うなど。情報の収集とその理解が大切です)

投稿2019/07/12 01:23

tor4kichi

総合スコア763

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

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

_080808.Yu

2019/07/12 03:02

ありがとうございます。(回答見る前に自己解決してしまいました汗) やはり参考書は必要なんですね。
tor4kichi

2019/07/12 03:20

解決できたようで何よりです。 エラーメッセージと格闘して覚えていくのも一つの方法ですが、Unityによるゲーム制作の本丸部分からたぶん遠い部分でつまづいてしまうのは辛いかなと思うので、C#の基礎部分は本などでまとまてガッと覚えてしまう方が個人的にはオススメです。 Unityの教本があるとして、Unityのことは教えてくれるけどC#は薄め、という印象であれば、何かしら書籍を手元に置いておくのは学習が捗ると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問