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

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

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

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

Unity

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

Q&A

解決済

1回答

505閲覧

ある関数で変更した変数が、同じスクリプト上の別の関数では変更されていない

puika

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2017/09/19 04:50

編集2017/09/19 07:28

こんにちは

Player.cs上の関数 WhoesTurn() で whoesTurn (小文字)を異なるスクリプトから別の値に変更しても、 変更が反映されないです。

//Player.cs [HideInInspector] public WT whoesTurn = WT.player; private void Update () { Debug.Log (whoesTurn); if (whoesTurn != WT.player) return; } public void WhoesTurn (WT a) { whoesTurn = a; Debug.Log (whoesTurn); }
//GameManager.cs public enum WT {player, pmoving, startEnemy, moveEnemy, enemy, gameover} public class GameManager : MonoBehaviour { [HideInInspector] public WT whoesTurn = WT.player; void ChangeTurn (WT a) { whoesTurn = a; pS.WhoesTurn (a); //pSはPlayer pSです。 } IEnumerator MoveEnemies() { ChangeTurn (WT.moveEnemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.enemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.player); }

MoveEnemies()を実行すると、WhoesTurn()のDebug.LogはmoveEnemy, enemy, playerと変わりますが、Update()のDebug.LogはstartEnemyのまま変わりません。

ちなみに、Player.csから全く同じ仕組みでGameManager.csの変数(こちらもwhoesTurnという名前です)を変更すると、値は他の関数でも適用されます。

よろしくお願いします。

*追記*
ご回答ありがとうございます。

whoesTurnに関係している箇所を挙げていきます。
Player.cs側

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Player : MovingObject { //MonoBehaviourでないのは関係するでしょうか [HideInInspector] public WT whoesTurn = WT.player; private GameManager gmS; private void Update () { Debug.Log (whoesTurn); //ここは最初playerで、直後のif文が行われると以後startEnemyで変わらなくなります。 if (whoesTurn != WT.player) return; if (!key && transform.eulerAngles == new Vector3 (0f, 0f, rz)) { AttemptMove (x, y, false); } } protected override void AttemptMove (int xDir, int yDir, bool isEnemy) { base.AttemptMove (xDir, yDir, isEnemy); ChangeTurn (WT.startEnemy); } public void WhoesTurn (WT a) //GameManager.csからの変更は全てこの関数で行います。 { whoesTurn = a; Debug.Log (whoesTurn); //ここの時点では変更されています。 } void ChangeTurn (WT a) //Player.csからの変更は全てこの関数で行います。 { whoesTurn = a; gmS.WhoesTurn (a); } }

GameManager.cs側

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public enum WT {player, pmoving, startEnemy, moveEnemy, enemy, gameover} public class GameManager : MonoBehaviour { [HideInInspector] public WT whoesTurn = WT.player; private Player pS; void Update () { if (whoesTurn == WT.startEnemy) { //ここはPlayer.csから変更できています。 StartCoroutine (MoveEnemies ()); } } IEnumerator MoveEnemies() { ChangeTurn (WT.moveEnemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.enemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.player); } public void WhoesTurn (WT a) //Player.csからの変更は全てこの関数で行います。 { whoesTurn = a; } void ChangeTurn (WT a) //GameManager.csからの変更は全てこの関数で行います。 { whoesTurn = a; pS.WhoesTurn (a); } }

このようになっております。
私が見つけたPlayer.csからの変更とGameManager.csとの相違点は、
・継承しているクラスが異なる。
・GameManager.csからはCoroutine中で変更している。
の二点です。

長くなってしまいましたが、どうぞよろしくお願いいたします。

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

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

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

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

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

fiveHundred

2017/09/19 06:52

こちらで試してみましたが、特に問題は見当たりませんでした。提示のソースにはstartEnemyにしている箇所はないため、おそらく他の箇所で行っていると思いますが、その箇所はどうなっておりますでしょうか?
puika

2017/09/19 07:30

ご回答ありがとうございます!ソースを追加いたしましたので、お願いいたします。
puika

2017/09/19 08:57

そうです
sakura_hana

2017/09/20 00:25

MovingObject.csもソースを提示して頂けますか?
guest

回答1

0

自己解決

みなさまありがとうございました。
どうやらUnity側のエラーだったようで、関連するスクリプトを全て削除し、同じ内容のものを再度作成すると何も問題なく動きました。
お騒がせして申し訳ないです…。

投稿2017/09/23 01:09

puika

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問