yo_s1124
@yo_s1124

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

オブジェクトを特定の座標に移動させる動作について

Unityで2Dゲームを作成しています。特定のキーを入力すると、操作キャラクターが入れ替わる機構を作成しようとしたのですが、問題が発生しています。

【想定している仕様】

1.特定のキーを入力すると、操作キャラクターと同じ座標に別のキャラクターを呼び出す(移動させる)
2.操作キャラクターはゲームに干渉しない座標に移動させ、操作を受け付けなくする

の1の仕様を作成中に行き詰まってしまいました。オブジェクトに値を保持したいため、Prefabの生成は用いていません。

【問題点】

以下のスクリプトを操作キャラクターに関係ないオブジェクトに記述したのですが、キャラクターが移動後、座標の移動を行わなくなってしまいました。(移動アニメーションや方向転換はする)

void Update()
    {
        if(Input.GetKeyDown(KeyCode.C))
        {
            PlayerNumber += 1;
            currentPlayer = PlayerLife[PlayerNumber];
            Debug.Log(PlayerNumber + currentPlayer);
        }
        //currentPlayerに応じてアクティブキャラクターのトリガーを設定,アクティブキャラクターの座標を取得
        if(currentPlayer == "Warrior")
        {
            WarriorActive = true;
            MageActive = false;
            NinjaActive = false;

        }

        if(currentPlayer == "Mage")
        {
            WarriorActive = false;
            MageActive = true;
            NinjaActive = false;
        }

        if(currentPlayer == "Ninja")
        {
            WarriorActive = false;
            MageActive = false;
            NinjaActive = true;
        }

        //アクティブになったときに現在座標に呼び出す
        if(WarriorActive == true)
        {
            Warrior.transform.position = new Vector3(ActiveX,ActiveY,0);
            WarriorActive = false;
        }
        else if(currentPlayer == "Warrior")
        {
            ActiveX = Warrior.transform.position.x;
            ActiveY = Warrior.transform.position.y;
        }

        if(MageActive == true)
        {
            Mage.transform.position = new Vector3(ActiveX,ActiveY,0);
            MageActive = false;
        }
        else if(currentPlayer == "Mage")
        {
            ActiveX = Mage.transform.position.x;
            ActiveY = Mage.transform.position.y;
        }

        if(NinjaActive == true)
        {
            Ninja.transform.position = new Vector3(ActiveX,ActiveY,0);
            NinjaActive = false;
        }
        else if(currentPlayer == "Ninja")
        {
            ActiveX = Ninja.transform.position.x;
            ActiveY = Ninja.transform.position.y;
        }

キャラクターの遷移はListを作成し、キーが入力されるたびに値を順番に取り出しています。また、座標への呼び出しはbool型を用いて一回だけ作動するようにしているはずなのですが…

移動操作は

transform.position += new Vector3(0,-0.1f,0);

という記述で行っているのですが、移動先の座標を指定する際にnew Vector3を使っているのが悪さをしているのかな?といった感じです。
想定している仕様への別のアプローチや、現状発生している問題の特定や代案等、お力をお貸しいただけませんでしょうか?まだUnityを触って日が浅く、丸投げな質問になってしまうことをお許しください。

0

1Answer

座標への呼び出しはbool型を用いて一回だけ作動するようにしているはず

と書いていますが、xxxxActiveへの値の設定はキャラクタを切り替えたときではなくUpdateが呼ばれるたびに毎回必ず行うようになっています。

切り替わった時だけ設定したいのなら、if(Input.GetKeyDown(KeyCode.C)){ ... }ブロックの中に書く必要があります。

あと変数名ですが

WarriorActive
WarriorがActiveである(状態を示す)
WarriorActivated
WarriorがActiveになった(トリガーを示す)
つまりWarriorActiveだとトリガーを表している名前ではないため、後で見直したりするとき自分を騙すことになってしまうこともよくあります。
0Like

Your answer might help someone💌