サイドビューアクションゲームの
会話イベントを作っていたのですか
NPCに接触して会話イベントが発生したら
そのまま動かなくなってしまいました・・・・
何故でしょうか?
該当のソースコード
プレイヤーのスプリクト
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; // 地面に立っているフラグ
public float stopf = 1;
// アニメーション対応
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,
}
void Start ()
{
rbody = this.GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>(); nowAnime = stopAnime; oldAnime = stopAnime; gameState = "playing"; }
public void SetState(State state)
{
}
public static string gameState = "playing"; // ゲームの状態
public int score = 0; // スコア
// タッチスクリーン対応追加
bool isMoving = false;
// Update is called once per frame
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()
{
animator.Play(stopAnime);
}
private void MoveEvent()
{
if (gameState != "playing") { return; } // 地上判定 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"))
{
state = State.Talk;
}
}
// 接触開始
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);
}
}
// ゴール
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;
}
}
}
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 OnCollisionEnter2D(UnityEngine.Collision2D other)
{
if (other.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); }
}
}
これらのコードは
入門書に載っていたサイドビューアクションのコードと
参考サイトに載っていたトップビューの会話イベントのコードを
参考に作った物です
補足情報
Unityのバージョン
2021.3.19
会話イベント実装に使ったアセット
Fungus

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