ゲームオーバ後やゲームクリア後も
操作出来てしまいます。
(特に、
ゲームクリアにうごいてしまい、
それが原因でゲームオーバになった場合、
リトライが出来なくなって詰みになります)
参考書のコードを参考にして書いてみたのですか・・・・
何故、トークイベント中は停止出来て
クリアやゲームオーバ時は停止出来ないのでしょうか・・・・
該当のソースコード
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)
{
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); // 左右反転させる
}
}
}
// 地上判定
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;
axisH = Input.GetAxisRaw("Horizontal");
GameStop();
}
}
// Goal
public void Goal()
{
animator.Play(goalAnime);
number = 1;
if (number == 1)
{
isMoving = true;
axisH = Input.GetAxisRaw("Horizontal");
gameState = "gameclear";
GameStop();
}
}
// ゲームオーバー
public void GameOver()
{
animator.Play(stopAnime);
number = 1;
if (number == 1)
{
isMoving = true;
axisH = Input.GetAxisRaw("Horizontal");
gameState = "gameover";
GameStop();
}
// ゲームオーバー演出
// =====================
// プレイヤー当たりを消す
GetComponent<CapsuleCollider2D>().enabled = false;
// プレイヤーを上に少し跳ね上げる演出
rbody.AddForce(new Vector2(0,15), 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;
}
}
}
Unityのバージョン
2021.3.19
(関係ないと思いますが)
会話イベント作成に使ったアセット
Fungus

あなたの回答
tips
プレビュー