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

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

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

Q&A

1回答

500閲覧

状態の分岐が出来ません

L3VFKJ

総合スコア0

0グッド

1クリップ

投稿2023/03/08 15:00

会話イベントとそれ以外の分岐

会話イベント付のサイドビューを作っています。
会話イベントにtalk
その時以外にはnormal
とstateを分け、
normalでは左右に動いたり 
ジャンプしたりなど自由に動き
talkでは操作できなくして静止したいのですが、
state事の分岐方法がわからなくて……

他サイトを参考にしても
stateを作った先からが出来なくて……
(例え分岐したとしても、ジャンプや移動モーションのままのポーズで移動したり……)

ゲームエンジン
ユニティ 2021・1・13
fungus

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

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

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

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

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

y_waiwai

2023/03/08 22:57

コードを提示しよう
L3VFKJ

2023/03/09 12:15

NPC側のスクリプトなら…… using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Fungus; [RequireComponent(typeof(Flowchart))] public class Hit : MonoBehaviour { [SerializeField] string message = ""; GameObject playerObj; Flowchart flowChart; PlayerController player;    void Start() { playerObj = GameObject.FindGameObjectWithTag("Player"); player = playerObj.GetComponent<PlayerController>(); flowChart = GetComponent<Flowchart>(); } private void OnTriggerEnter2D(Collider2D collision) { if(collision.gameObject.tag ==("Player"))   { StartCoroutine(Talk()); } IEnumerator Talk() { player.SetState(PlayerController.State.Talk); flowChart.SendFungusMessage(message); yield return new WaitUntil(() => flowChart.GetExecutingBlocks().Count == 0); player.SetState(PlayerController.State.Normal); } } }
guest

回答1

0

C#

1[RequireComponent(typeof(Rigidbody2D))] 2public class Test : MonoBehaviour 3{ 4 [SerializeField] private FixedJoystick fixedJoystick; 5 private int number = 0; // 最初は移動が出来る 6 Rigidbody2D rb; // Rigidbody2D 型の変数 7 float speed; 8 [SerializeField] float currentSpeed; 9 float axisH; 10 bool isMoving = false; 11 12 public enum State 13 { 14 Normal, 15 Talk, 16 } 17 State state = State.Normal; 18 19 private void Start() 20 { 21 rb = GetComponent<Rigidbody2D>(); 22 } 23 private void Update() 24 { 25 if (number == 0) 26 { 27 state = State.Normal; 28 } 29 if (number == 1) 30 { 31 state = State.Talk; 32 } 33 } 34 35 private IEnumerator TalkEvent() 36 { 37 // トークイベント 38 isMoving = true; 39 40 /* 41 会話中は入力を受け付けない 42 */ 43 yield return new WaitForSeconds(50f); 44 45 isMoving = false; 46 } 47 48 private void MoveEvent() 49 { 50 if (!isMoving) 51 { 52 // 移動 53 axisH = fixedJoystick.Horizontal; // 水平方向の入力をチェックする 54 speed = currentSpeed; 55 rb.velocity = new Vector2(axisH, rb.velocity.y) * speed * Time.deltaTime; // 速度を更新する 56 } 57 } 58 59 private void FixedUpdate() 60 { 61 switch (state) 62 { 63 case State.Talk: 64 StartCoroutine("TalkEvent"); 65 break; 66 case State.Normal: 67 MoveEvent(); 68 break; 69 default: 70 break; 71 } 72 } 73 74 private void OnTriggerEnter2D(Collider2D other) 75 { 76 // もし何らかのTriggerに当たったらトークイベント 77 if (other.gameObject.CompareTag("Enemy")) 78 { 79 number = 1; 80 isMoving = true; 81 state = State.Talk; 82 Debug.Log("敵キャラクターとの会話"); 83 } 84 } 85 86 private void OnTriggerExit2D(Collider2D other) 87 { 88 if (other.gameObject.CompareTag("Enemy")) 89 { 90 number = 0; 91 isMoving = false; 92 Debug.Log("会話を終わる"); 93 } 94 } 95}

修正しました。JoyStickPackというのをダウンロードして、バーチャルパッドでプレイヤーの左右移動が出来ます。移動を受け付けたくない時は、isMoving=true;なので、isMoving=false;で移動出来るように、会話イベント終了時にfalseにしてあげて下さい。
Youtubeから
こちらの動画を参考にやってみました。

投稿2023/03/08 15:41

編集2023/03/14 11:40
isimasa

総合スコア295

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

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

L3VFKJ

2023/03/09 10:46

詳細な回答ありがとうございます。 早速試してみます
L3VFKJ

2023/03/10 13:34

プレイヤー側のスクリプトに あのコードを組み込んでみました。 (つまり、質問を投稿した時点で スクリプトが存在してました、 質問へのコメントにあるように、 コードを掲示すべきでした、すみません。) 分岐には成功し、 通常時には動き 会話イベント時には動きは停止しましたが、 最初に会話イベントが発生したときに 自動的にスライドしていまい、 また、方向キーの入力に反応して 左右の向きを変えてしまいます。 どうすればいいでしょうか? ctions; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { Rigidbody2D rbody; // Rigidbody2D 型の変数 float axisH = 0.0f; // 入力 public float speed = 9.0f; // 移動速度 public float jump = 20.0f; // ジャンプ力 public LayerMask groundLayer; // 着地できるレイヤー bool goJump = false; // ジャンプ開始フラグ bool onGround = false; // 地面に立っているフラグ // アニメーション対応 Animator animator; // アニメーター public string stopAnime = "PlayerStop"; public string moveAnime = "PlayerMove"; public string jumpAnime = "PlayerJump"; public string goalAnime = "PlayerGoal"; public string deadAnime = "PlayerOver"; string nowAnime = ""; string oldAnime = ""; State state; public enum State { Normal, Talk, } public void SetState(State state) { this.state = state; } void Start() { // Rigidbody2Dを取ってくる rbody = this.GetComponent<Rigidbody2D>(); // Animator を取ってくる animator = GetComponent<Animator>(); nowAnime = stopAnime; oldAnime = stopAnime; gameState = "playing"; // ゲーム中にする } private void Update() { switch (state) { case State.Talk: TalkEvent(); break; case State.Normal: MoveEvent(); break; default: break; } if (gameState != "playing") { return; } // 移動 if (isMoving == false) { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); } // 向きの調整 if (axisH > 0.0f) { // 右移動 Debug.Log("右移動"); transform.localScale = new Vector2(1,1); } else if (axisH < 0.0f) { // 左移動 Debug.Log("左移動"); transform.localScale = new Vector2(-1, 1); // 左右反転させる } // キャラクターをジャンプさせる if (Input.GetButtonDown("Jump")) { Jump(); // ジャンプ } } private void TalkEvent() { number = 1; // もし会話イベントが終了したら number = 0; } private int number = 0; public static string gameState = "playing"; // ゲームの状態 public int score = 0; // スコア // タッチスクリーン対応追加 bool isMoving = false; private void MoveEvent() { number = 0; // 地上判定 onGround = Physics2D.Linecast(transform.position, transform.position - (transform.up * 0.1f), groundLayer); if (onGround || axisH != 0) { // 地面の上 or 速度が 0 ではない // 速度を更新する rbody.velocity = new Vector2(speed * axisH, rbody.velocity.y); } if(onGround && goJump) { // 地面の上でジャンプキーが押された // ジャンプさせる Debug.Log(" ジャンプ! "); Vector2 jumpPw = new Vector2(0, jump); // ジャンプさせるベクトルを作る rbody.AddForce(jumpPw, ForceMode2D.Impulse); // 瞬間的な力を加える goJump = false; // ジャンプフラグを下ろす } if (onGround) { // 地面の上 if(axisH == 0) { nowAnime = stopAnime; // 停止中 } else { nowAnime = moveAnime; // 移動 } } else { // 空中 nowAnime = jumpAnime; } if(nowAnime != oldAnime) { oldAnime = nowAnime; animator.Play(nowAnime); // アニメーション再生 } } void FixedUpdate() { } // ジャンプ public void Jump() { goJump = true; // ジャンプフラグを立てる Debug.Log(" ジャンプボタン押し! "); } private void OnCollisionEnter2D(UnityEngine.Collision2D other) {   if (other.gameObject.tag == ("NPC")) { TalkScene(); } } // 接触開始 private void OnTriggerEnter2D(Collider2D collision) {   if(collision.gameObject.tag == "Goal") { Goal(); // ゴール!! } else if (collision.gameObject.tag == "Over") { GameOver(); // ゲームオーバー } else if (collision.gameObject.tag == "ScoreItem") { // スコアアイテム // ItemData を得る ItemData item = collision.gameObject.GetComponent<ItemData>(); // スコアを得る score = item.value; // アイテム削除する Destroy(collision.gameObject); } } // Talk public void TalkScene() { animator.Play(stopAnime); number = 1; GameStop(); // ゲーム停止 } // ゴール public void Goal() { animator.Play(goalAnime); gameState = "gameclear"; GameStop(); // ゲーム停止 } // ゲームオーバー public void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rbody.AddForce(new Vector2(0, 5), ForceMode2D.Impulse); } // ゲーム停止 void GameStop() { // Rigidbody2D を取ってくる Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 rbody.velocity = new Vector2(0, 0); } // タッチスクリーン対応追加 public void SetAxis(float h, float v) { axisH = h; if (axisH == 0) { isMoving =
isimasa

2023/03/11 03:35

if (isMoving == false)で移動できるので、移動もしくは向きの変更をさせたくないときは、isMoving == trueで動かないようにすることができると考えます。 最初に会話イベントが発生したときに自動的にスライドさせないようにする条件として、何かキーが押されたまたは、タッチスクリーンで反応があったときスライドさせるようにすれば良いと考えました。
KKK32

2023/03/11 11:55

(SNSのエラーでログインできなかったので別のアカウントから失礼します。) アドバイスありがとうございます アドバイスを参考に修正したところ pc版のキーボード操作では仕様通りの会話イベントになりましたが、 モバイル版のバーチャルパッドでは何故が動作がおかしくなってしまいました まず、通常時の動作ですか 方向操作パッドを左右に動かしても、入力した方向に関わらず プレイヤーキャラクターの向きがそのままで 移動モーションを震えるように小刻みに繰り返してしまい、 会話イベントでは、 逆にその場で入力方向に応じて向きだけを変えてしまいます。 次は、バージョンパッド操作での動作の修正に取り掛かりたいと思います。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { Rigidbody2D rbody; // Rigidbody2D 型の変数 float axisH = 0.0f; // 入力 public float speed = 9.0f; // 移動速度 public float jump = 20.0f; // ジャンプ力 public LayerMask groundLayer; // 着地できるレイヤー bool goJump = false; // ジャンプ開始フラグ bool onGround = false; // 地面に立っているフラグ // アニメーション対応 Animator animator; // アニメーター public string stopAnime = "PlayerStop"; public string moveAnime = "PlayerMove"; public string jumpAnime = "PlayerJump"; public string goalAnime = "PlayerGoal"; public string deadAnime = "PlayerOver"; string nowAnime = ""; string oldAnime = ""; State state; public enum State { Normal, Talk, } public void SetState(State state) { this.state = state; } void Start() { // Rigidbody2Dを取ってくる rbody = this.GetComponent<Rigidbody2D>(); // Animator を取ってくる animator = GetComponent<Animator>(); nowAnime = stopAnime; oldAnime = stopAnime; gameState = "playing"; // ゲーム中にする } private void Update() { switch (state) { case State.Talk: TalkEvent(); break; case State.Normal: MoveEvent(); break; default: break; } if (gameState != "playing") { return; } // 移動 if (isMoving == false) { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); } // 向きの調整 if (axisH > 0.0f) { // 右移動 transform.localScale = new Vector2(1,1); } else if (axisH < 0.0f) { // 左移動 transform.localScale = new Vector2(-1, 1); // 左右反転させる } // キャラクターをジャンプさせる if (Input.GetButtonDown("Jump")) { Jump(); // ジャンプ } } private void TalkEvent() { number = 1; // もし会話イベントが終了したら number = 0; } private int number = 0; public static string gameState = "playing"; // ゲームの状態 public int score = 0; // スコア // タッチスクリーン対応追加 bool isMoving = false; private void MoveEvent() { number = 0; if (number == 0) { isMoving = false; } // 地上判定 onGround = Physics2D.Linecast(transform.position, transform.position - (transform.up * 0.1f), groundLayer); if (onGround || axisH != 0) { // 地面の上 or 速度が 0 ではない // 速度を更新する rbody.velocity = new Vector2(speed * axisH, rbody.velocity.y); } if(onGround && goJump) { // 地面の上でジャンプキーが押された // ジャンプさせる Vector2 jumpPw = new Vector2(0, jump); // ジャンプさせるベクトルを作る rbody.AddForce(jumpPw, ForceMode2D.Impulse); // 瞬間的な力を加える goJump = false; // ジャンプフラグを下ろす } if (onGround) { // 地面の上 if(axisH == 0) { nowAnime = stopAnime; // 停止中 } else { nowAnime = moveAnime; // 移動 } } else { // 空中 nowAnime = jumpAnime; } if(nowAnime != oldAnime) { oldAnime = nowAnime; animator.Play(nowAnime); // アニメーション再生 } } void FixedUpdate() { } // ジャンプ public void Jump() { goJump = true; // ジャンプフラグを立てる } private void OnCollisionEnter2D(UnityEngine.Collision2D other) {   if (other.gameObject.tag == ("NPC")) { TalkScene(); } } // 接触開始 private void OnTriggerEnter2D(Collider2D collision) {   if(collision.gameObject.tag == "Goal") { Goal(); // ゴール!! } else if (collision.gameObject.tag == "Over") { GameOver(); // ゲームオーバー } else if (collision.gameObject.tag == "ScoreItem") { // スコアアイテム // ItemData を得る ItemData item = collision.gameObject.GetComponent<ItemData>(); // スコアを得る score = item.value; // アイテム削除する Destroy(collision.gameObject); } } // Talk public void TalkScene() { animator.Play(stopAnime); number = 1; if (number == 1) { isMoving = true; } GameStop(); // ゲーム停止 } // ゴール public void Goal() { animator.Play(goalAnime); gameState = "gameclear"; GameStop(); // ゲーム停止 } // ゲームオーバー public void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rbody.AddForce(new Vector2(0, 5), ForceMode2D.Impulse); } // ゲーム停止 void GameStop() { // Rigidbody2D を取ってくる Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 rbody.velocity = new Vector2(0, 0); } // タッチスクリーン対応追加 public void SetAxis(float h, float v) { axisH = h; if (axisH == 0) { isMoving = false; } else { isMoving = true; } } }
KKK32

2023/03/12 07:41

(↑の追記) ジャンプの挙動についてですか、 向きは操作できませんが上昇と下降は問題なくできます また、空中にいる時は バーチャルパッドの方向キーで操作しても スムーズに移動できます (向きは地上にいる時と同じくそのままですか)
KKK32

2023/03/12 07:54

試しに、このコードにしてみましたが バーチャルパッドの移動Buttonには一切反応しなくなりました。 Jumpボタンには反応したのですか・・・ using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { Rigidbody2D rbody; // Rigidbody2D 型の変数 float axisH = 0.0f; // 入力 public float speed = 9.0f; // 移動速度 public float jump = 20.0f; // ジャンプ力 public LayerMask groundLayer; // 着地できるレイヤー bool goJump = false; // ジャンプ開始フラグ bool onGround = false; // 地面に立っているフラグ // アニメーション対応 Animator animator; // アニメーター public string stopAnime = "PlayerStop"; public string moveAnime = "PlayerMove"; public string jumpAnime = "PlayerJump"; public string goalAnime = "PlayerGoal"; public string deadAnime = "PlayerOver"; string nowAnime = ""; string oldAnime = ""; State state; public enum State { Normal, Talk, } public void SetState(State state) { this.state = state; } // タッチスクリーン対応追加 bool isMoving = false; void Start() { // Rigidbody2Dを取ってくる rbody = this.GetComponent<Rigidbody2D>(); // Animator を取ってくる animator = GetComponent<Animator>(); nowAnime = stopAnime; oldAnime = stopAnime; gameState = "playing"; // ゲーム中にする } private void Update() { switch (state) { case State.Talk: TalkEvent(); break; case State.Normal: MoveEvent(); break; default: break; } if (gameState != "playing") { return; } // 移動 if (isMoving == false) { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); } // 向きの調整 if (axisH > 0.0f) { // 右移動 transform.localScale = new Vector2(1,1); } else if (axisH < 0.0f) { // 左移動 transform.localScale = new Vector2(-1, 1); // 左右反転させる } // キャラクターをジャンプさせる if (Input.GetButtonDown("Jump")) { Jump(); // ジャンプ } } private void TalkEvent() { number = 1; // もし会話イベントが終了したら number = 0; } private int number = 0; public static string gameState = "playing"; // ゲームの状態 public int score = 0; // スコア private void MoveEvent() { number = 0; if (number == 0) { isMoving = false; { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); } } // 地上判定 onGround = Physics2D.Linecast(transform.position, transform.position - (transform.up * 0.1f), groundLayer); if (onGround || axisH != 0) { // 地面の上 or 速度が 0 ではない // 速度を更新する rbody.velocity = new Vector2(speed * axisH, rbody.velocity.y); } if(onGround && goJump) { // 地面の上でジャンプキーが押された // ジャンプさせる Vector2 jumpPw = new Vector2(0, jump); // ジャンプさせるベクトルを作る rbody.AddForce(jumpPw, ForceMode2D.Impulse); // 瞬間的な力を加える goJump = false; // ジャンプフラグを下ろす } if (onGround) { // 地面の上 if(axisH == 0) { nowAnime = stopAnime; // 停止中 } else { nowAnime = moveAnime; // 移動 } } else { // 空中 nowAnime = jumpAnime; } if(nowAnime != oldAnime) { oldAnime = nowAnime; animator.Play(nowAnime); // アニメーション再生 } } void FixedUpdate() { } // ジャンプ public void Jump() { goJump = true; // ジャンプフラグを立てる } private void OnCollisionEnter2D(UnityEngine.Collision2D other) {   if (other.gameObject.tag == ("NPC")) { TalkScene(); } } // 接触開始 private void OnTriggerEnter2D(Collider2D collision) {   if(collision.gameObject.tag == "Goal") { Goal(); // ゴール!! } else if (collision.gameObject.tag == "Over") { GameOver(); // ゲームオーバー } else if (collision.gameObject.tag == "ScoreItem") { // スコアアイテム // ItemData を得る ItemData item = collision.gameObject.GetComponent<ItemData>(); // スコアを得る score = item.value; // アイテム削除する Destroy(collision.gameObject); } } // Talk public void TalkScene() { animator.Play(stopAnime); number = 1; if (number == 1) { isMoving = true; } GameStop(); // ゲーム停止 } // ゴール public void Goal() { animator.Play(goalAnime); gameState = "gameclear"; GameStop(); // ゲーム停止 } // ゲームオーバー public void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rbody.AddForce(new Vector2(0, 5), ForceMode2D.Impulse);} // ゲーム停止 void GameStop() { // Rigidbody2D を取ってくる Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 rbody.velocity = new Vector2(0, 0); } // タッチスクリーン対応追加 public void SetAxis(float h, float v) { axisH = h; if (axisH == 0) { isMoving = false; } else { isMoving = true; } } }
KKK32

2023/03/12 10:58

修正ありがとうございます。 早速試してみます。
KKK32

2023/03/12 22:57

再度修正ありがとうございます 早速試してみます
KKK32

2023/03/13 08:20

fixedJoystick モバイル用操作パッドのassetもあったんですね
KKK32

2023/03/14 10:47

アドバイスを参考に修正してみたのですか エラーが出て起動することもままなりませんでした。 以下がコードとエラーの詳細です。 プレイアブルキャラのスクリプト↓ using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { [SerializeField] private FixedJoystick fixedJoystick; private int number = 0; // 最初は移動が出来る Rigidbody2D rb; // Rigidbody2D 型の変数 [SerializeField] float currentSpeed; float axisH; bool isMoving = false; public float speed = 9.0f; // 移動速度 public float jump = 20.0f; // ジャンプ力 public LayerMask groundLayer; // 着地できるレイヤー bool goJump = false; // ジャンプ開始フラグ bool onGround = false; // 地面に立っているフラグ Animator animator; // アニメーター public string stopAnime = "PlayerStop"; public string moveAnime = "PlayerMove"; public string jumpAnime = "PlayerJump"; public string goalAnime = "PlayerGoal"; public string deadAnime = "PlayerOver"; string nowAnime = ""; string oldAnime = "";   State state = State.Normal; public int score = 0; // スコア public enum State { Normal, Talk, } public void SetState(State state) { this.state = state; } private void Start() { rb = GetComponent<Rigidbody2D>(); } private void Update() { if (number == 0) { state = State.Normal; } if (number == 1) { state = State.Talk; } } private IEnumerator TalkEvent() { // トークイベント isMoving = true; /* 会話中は入力を受け付けない */ yield return new WaitForSeconds(50f); isMoving = false; } public static string gameState = "playing"; private void MoveEvent() { if (!isMoving) { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); // 向きの調整 if (axisH > 0.0f) { // 右移動 Debug.Log("右移動"); transform.localScale = new Vector2(1,1); } else if (axisH < 0.0f) { // 左移動 Debug.Log("左移動"); transform.localScale = new Vector2(-1, 1); // 左右反転させる } { // 移動 axisH = fixedJoystick.Horizontal; // 水平方向の入力をチェックする speed = currentSpeed; rb.velocity = new Vector2(axisH, rb.velocity.y) * speed * Time.deltaTime; // 速度を更新する } } void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rb.AddForce(new Vector2(0,15), ForceMode2D.Impulse);} // ゲーム停止 void GameStop() { // Rigidbody2D Rigidbody2D rb = GetComponent<Rigidbody2D>(); // rb.velocity = new Vector2(0, 0); } if (onGround) { // 地面の上 if(axisH == 0) { nowAnime = stopAnime; // 停止中 } else { nowAnime = moveAnime; // 移動 } } else { // 空中 nowAnime = jumpAnime; } if(nowAnime != oldAnime) { oldAnime = nowAnime; animator.Play(nowAnime); // アニメーション再生 } } private void FixedUpdate() { switch (state) { case State.Talk: StartCoroutine("TalkEvent"); break; case State.Normal: MoveEvent(); break; default: break; } } // ジャンプ public void Jump() { goJump = true; // ジャンプフラグを立てる } private void OnTriggerEnter2D(Collider2D collision) {   if(collision.gameObject.tag == "Goal") { Goal(); // ゴール!! } else if (collision.gameObject.tag == "Over") { GameOver(); // ゲームオーバー } else if (collision.gameObject.tag == "ScoreItem") { // スコアアイテム // ItemData を得る ItemData item = collision.gameObject.GetComponent<ItemData>(); // スコアを得る score = item.value; // アイテム削除する Destroy(collision.gameObject); // TalkEvent if (gameObject.CompareTag("NPC")) { number = 1; isMoving = true; state = State.Talk; } } } private void OnTriggerExit2D(Collider2D other) { if (gameObject.CompareTag("NPC")) { number = 0; isMoving = false; } } // ゴール public void Goal() { animator.Play(goalAnime); gameState = "gameclear"; GameStop(); // ゲーム停止 } // ゲームオーバー public void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rb.AddForce(new Vector2(0,15), ForceMode2D.Impulse);} // ゲーム停止 void GameStop() { // Rigidbody2D を取ってくる Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 rb.velocity = new Vector2(0, 0); } public void SetAxis(float h, float v) { axisH = h; if (axisH == 0) { isMoving = false; } else { isMoving = true; } } } エラー内容 NullReferenceException: Object reference not set to an instance of an object PlayerController.MoveEvent () (at Assets/Player/script/PlayerController.cs:101) PlayerController.FixedUpdate () (at Assets/Player/script/PlayerController.cs:161) 修正を試みたのですが cs:161の行を消すと プレイアブルキャラが動かなくなってしまい、 cs:101の行を消すと 別のエラーが出てしまいます。 エラーの意味も Bing 翻訳で翻訳してみたのですが 例外: オブジェクト参照がオブジェクトのインスタンスに設定されていません の意味もよくわかりませんし・・・ 、
KKK32

2023/03/14 11:42

動画のURLをわざわざありがとうございます。
KKK32

2023/03/14 13:39

何度も、 アドバイスを修正していただいて申し訳ないですが 自分なりに工夫して後述のコードにして何とかエラーは出なくなったのですか・・・ 今度はジャンプ中のモーションのまま 動かなくなってしまいました矢印キーの操作では向きが反転するだけで 動きませんし モバイル用操作パッドには全く反応しません。 アドバイスにあった動画を参考したり 「Unity オブジェクトのインスタンス設定」で  何度も検索したりしたのですが・・・・ とりあえず、 プレイアブルキャラのスクリプトを貼っておきます。   using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { [SerializeField] private FixedJoystick fixedJoystick; private int number = 0; // 最初は移動が出来る Rigidbody2D rb; // Rigidbody2D 型の変数 [SerializeField] float currentSpeed; float axisH; bool isMoving = false; public float speed = 9.0f; // 移動速度 public float jump = 20.0f; // ジャンプ力 public LayerMask groundLayer; // 着地できるレイヤー bool goJump = false; // ジャンプ開始フラグ bool onGround = false; // 地面に立っているフラグ Animator animator; public string stopAnime = "PlayerStop"; public string moveAnime = "PlayerMove"; public string jumpAnime = "PlayerJump"; public string goalAnime = "PlayerGoal"; public string deadAnime = "PlayerOver"; string nowAnime = ""; string oldAnime = "";   State state = State.Normal; public int score = 0; // スコア public enum State { Normal, Talk, } public void SetState(State state) { this.state = state; } private void Start() { rb = GetComponent<Rigidbody2D>(); // Animator を取ってくる animator = GetComponent<Animator>(); nowAnime = stopAnime; oldAnime = stopAnime; gameState = "playing"; // ゲーム中にする } private void Update() { if (number == 0) { state = State.Normal; } if (number == 1) { state = State.Talk; } } private IEnumerator TalkEvent() { // トークイベント isMoving = true; /* 会話中は入力を受け付けない */ yield return new WaitForSeconds(50f); isMoving = false; } public static string gameState = "playing"; private void MoveEvent() { if (!isMoving) { // 水平方向の入力をチェックする axisH = Input.GetAxisRaw("Horizontal"); // 向きの調整 if (axisH > 0.0f) { transform.localScale = new Vector2(1,1); } else if (axisH < 0.0f) { transform.localScale = new Vector2(-1, 1); // 左右反転させる } { axisH = speed = currentSpeed; rb.velocity = new Vector2(axisH, rb.velocity.y) * speed * Time.deltaTime; // 速度を更新する } } void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rb.AddForce(new Vector2(0,15), ForceMode2D.Impulse);} // ゲーム停止 void GameStop() { // Rigidbody2D Rigidbody2D rb = GetComponent<Rigidbody2D>(); // rb.velocity = new Vector2(0, 0); } if (onGround) { // 地面の上 if(axisH == 0) { nowAnime = stopAnime; // 停止中 } else { nowAnime = moveAnime; // 移動 } } else { // 空中 nowAnime = jumpAnime; } if(nowAnime != oldAnime) { oldAnime = nowAnime; animator.Play(nowAnime); // アニメーション再生 } } void FixedUpdate() { switch (state) { case State.Talk: StartCoroutine("TalkEvent"); break; case State.Normal: MoveEvent(); break; default: break; } } public void Jump() { goJump = true; } private void OnTriggerEnter2D(Collider2D collision) {   if(collision.gameObject.tag == "Goal") { Goal(); // ゴール!! } else if (collision.gameObject.tag == "Over") { GameOver(); // ゲームオーバー } else if (collision.gameObject.tag == "ScoreItem") { // スコアアイテム // ItemData を得る ItemData item = collision.gameObject.GetComponent<ItemData>(); // スコアを得る score = item.value; // アイテム削除する Destroy(collision.gameObject); // TalkEvent if (gameObject.CompareTag("NPC")) { number = 1; isMoving = true; state = State.Talk; } } } private void OnTriggerExit2D(Collider2D other) { if (gameObject.CompareTag("NPC")) { number = 0; isMoving = false; } } public void Goal() { animator.Play(goalAnime); gameState = "gameclear"; GameStop(); // ゲーム停止 } // ゲームオーバー public void GameOver() { animator.Play(deadAnime); gameState = "gameover"; GameStop(); // ゲーム停止 // ===================== // ゲームオーバー演出 // ===================== // プレイヤー当たりを消す GetComponent<CapsuleCollider2D>().enabled = false; // プレイヤーを上に少し跳ね上げる演出 rb.AddForce(new Vector2(0,15), ForceMode2D.Impulse);} // ゲーム停止 void GameStop() { // Rigidbody2D を取ってくる Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 rb.velocity = new Vector2(0, 0); } public void SetAxis(float h, float v) { axisH = h; if (axisH == 0) { isMoving = false; } else { isMoving = true; } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問