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

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

ただいまの
回答率

90.38%

  • C#

    9489questions

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

  • Unity

    5849questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

Unity 2D Roguelikeでプレイヤーが動きません

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 61

MrDAUSX

score 2

前提・実現したいこと

Unity2019.3.0a3で2Dローグライクを作るアセットを組み立てています。
一点を除いて正常に動作するようになったのですが、
その一点が「プレイヤーが一歩しか進めない」というものでテストプレイが思ったようにいかず困っています。

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

場面の変更直後ゲームは始まるがプレイヤーが動ける方向に初めて動いた後見た目上一歩も動かなくなる。体力の消費や敵の移動は正常に行われている。

該当のソースコード

*Player.cs*

'''~略~

public class Player : MovingObject
{
~略~
protected override void AttemptMove<T>(int xDir, int yDir)
{
~略~

//MovingObjectのAttemptMoveを呼び出す
base.AttemptMove<T>(xDir, yDir);

RaycastHit2D hit;

//ゲームオーバーか確認
CheckIfGameOver();
//プレイヤーのターン終了
GameManager.instance.playerTurn = false;
}

//プレイヤーが壁にぶつかった場合、壁をチョップする
protected override void OnCantMove<T>(T component)
{
//Wallスクリプトを使えるように設定
Wall hitWall = component as Wall;
//壁にダメージを与える
'''hitWall.DamageWall(wallDamage);//'''
//↑もうまくいっていない
//チョップするアニメーションを呼び出す
animator.SetTrigger("PlayerChop");
}

~~略~~

// Update is called once per frame
void Update()
{
//プレイヤーのターンではない場合、何も実行しない
if (!GameManager.instance.playerTurn)
return;

//左右の移動
int horizontal = 0;
//上下の移動
int vertical = 0;
//左右の移動量を受け取る
horizontal = (int)(Input.GetAxisRaw("Horizontal"));
//上下の移動量を受け取る
vertical = (int)(Input.GetAxisRaw("Vertical"));

//上下左右のいずれかに移動を制限する
if (horizontal != 0)
{
vertical = 0;
}

//左右上下のいずれかに移動する場合
if (horizontal != 0 || vertical != 0)
{
//プレイヤーの侵攻方向に壁があるか確認
AttemptMove<Wall>(horizontal, vertical);
}
}

   
}

**MovingObject*

public abstract class MovingObject : MonoBehaviour
{

//移動可能か判断する ※blockingLayerに衝突する場合、移動しない
//boolはtrueかfalseを返す
//outで指定した変数は、取得可能になる
protected bool Move(int xDir, int yDir, out RaycastHit2D hit)
{
//現在地を取得
Vector2 start = transform.position;
//移動先を取得
Vector2 end = start + new Vector2(xDir, yDir);
//自身のColliderを一旦無効化する ※startとendの間にblockingLayerがあるか確認するときに不要なため
boxCollider.enabled = false;
//現在地と移動先の間にblockingLayerがあるか確認、ある場合取得
hit = Physics2D.Linecast(start, end, blockingLayer);
//確認が終わったため、Colliderを有効化する
boxCollider.enabled = true;

//現在地と移動先の間に、BlockingLayerがなければ移動する
if (hit.transform == false)
{
StartCoroutine(SmoothMovement(end));
//移動可能
return true;
}

//移動不可
return false;
}

以下略

C#

試したこと

levelをいじって敵の出てくる階層まで変更したところ、敵は正常にこちらに向かってくるのを確認した。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sakura_hana

    2019/07/12 09:57

    (ソースコードちゃんと見てません)
    各所に「Debug.Log」を仕込むなどして、どこまで正しく動いているのか、どの変数がどうなっているのかの確認を行ってください。現在はソースコード長すぎで質問というよりデバッグ依頼になっています。
    http://tsubakit1.hateblo.jp/entry/2015/12/02/212958

    また、ソースコードは前後に「```」を付けると分かりやすいです(以下参照)。
    https://teratail.com/help/question-tips

    キャンセル

  • MrDAUSX

    2019/07/12 13:10

    申し訳ありませんでした。改めて見直して関係のない箇所を削りました。まだ長すぎるのであれば、Playerの部分のみを提示するようにします

    キャンセル

  • sakura_hana

    2019/07/12 14:00 編集

    各所に「Debug.Log」を仕込むなどして、どこまで正しく動いているのか、どの変数がどうなっているのかの確認を行ってください。(2回目)
    例えば1度目のAttemptMoveでGameManager.instance.playerTurnがfalseになった後、提示のコード内ではtrueになる部分が無いので、「プレイヤーのターンではない場合、何も実行しない」に該当して以後の処理が実行されません。
    これが正しく動作しているか(他の箇所でtrueにされているので問題無い=他に原因があるのか、他の箇所にもtrueになる箇所が無い為にこれが「1歩しか動けない」の原因なのか)は「Debug.Log(GameManager.instance.playerTurn);」で確認可能ですが、あなたの環境でしか確かめられません。

    また、ソースコードの提示方法が違うのでそちらも修正してください(PCなら質問入力欄の右にサンプルが出るので、そちらも見ながら行ってください)。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9489questions

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

  • Unity

    5849questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。