丸い爪でも立ててみる

投稿日:2022/08/22 更新日:2022/08/23

【Unity】議題7 キャラクターを前後左右に歩かせてみる

はじめまして、すらです。

今回はキャラクターを実際にあるかせてみたいと思います。

 

  1. プレイヤーと相手が座る椅子の作成
  2. 机の作成
  3. プレイヤーキャラの作成
  4. 相手キャラの作成
  5. 部屋の内装の作成
  6. プレイヤーが部屋を歩けるようにする ←ココ
  7. プレイヤーが椅子に座れるようにする
  8. 椅子に座るモーションの作成
  9. じゃんけんのシステムを作成
  10. じゃんけんのモーションを作成
  11. 殴るモーションと殴られるモーションを作成
  12. キャラの表情の作成
  13. 椅子と一緒に倒れるモーションを作成
  14. セリフを表示するシステムの作成
  15. タイトルの作成

 

 

一人称視点のゲームって下を向いたときに自分のからだが見えるものと見えないものの2種類ありますよね。

skyrimのこの視点エロすぎて、スクショ撮るだけのつもりが右へ左へ揺らしてしばらく眺めてしまった…

見えないほうが作る際は楽なんですかね。

今回はせっかくなので見えるバージョンでやってみたいと思います。

 

わたしのようなゲーマーにとって、移動=WASDですが、もちろんそれらを押してもこのままではキャラは歩いてくれません。

WASDでキャラを動かすためにはそうなるようにコードを組む必要がもちろんありますので、とりあえずネットで拾ったスクリプトを適用させます。

今回は男の子を動かしたいので、男の子にplayercontroller.csをアタッチします。以下、クリックでスクリプトを表示できます。

playercontroller.cs 表示 ▼


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playercontroller : MonoBehaviour
{
    float x, z;
    float speed = 0.1f;

    public GameObject cam;
    public GameObject target;
    public Animator Anim;
    public Vector3 angle;

    Quaternion cameraRot, characterRot;
    float Xsensityvity = 3f, Ysensityvity = 3f;
    
    bool cursorLock = true;

    //角度の制限
    float minX = -90f, maxX = 90f;

    // Start is called before the first frame update
    void Start()
    {
        cameraRot = cam.transform.localRotation;
        characterRot = transform.localRotation;
    }

    // Update is called once per frame
    void Update()
    {
        float xRot = Input.GetAxis("Mouse X") * Ysensityvity;
        float yRot = Input.GetAxis("Mouse Y") * Xsensityvity;

        cameraRot *= Quaternion.Euler(-yRot, 0, 0);
        characterRot *= Quaternion.Euler(0, xRot, 0);

        cameraRot = ClampRotation(cameraRot);

        //上下カメラ
        cam.transform.localRotation = cameraRot;
        //左右カメラ
        transform.localRotation = characterRot;


        UpdateCursorLock();
        
    }

    private void FixedUpdate()
    {
        x = 0;
        z = 0;

        x = Input.GetAxisRaw("Horizontal") * speed;
        z = Input.GetAxisRaw("Vertical") * speed;

        //transform.position += new Vector3(x,0,z);

        transform.position += target.transform.forward * z + target.transform.right * x;
    }


    public void UpdateCursorLock()
    {
        if(Input.GetKeyDown(KeyCode.Escape))
        {
            cursorLock = false;
        }
        else if(Input.GetMouseButton(0))
        {
            cursorLock = true;
        }


        if (cursorLock)
        {
            Cursor.lockState = CursorLockMode.Locked;
        }
        else if(!cursorLock)
        {
            Cursor.lockState = CursorLockMode.None;
        }
    }
    
    //角度制限関数
    public Quaternion ClampRotation(Quaternion q)
    {
        //q = x,y,z,w (x,y,zはベクトル(量と向き):wはスカラー(座標とは無関係の量))

        q.x /= q.w;
        q.y /= q.w;
        q.z /= q.w;
        q.w = 1f;

        float angleX = Mathf.Atan(q.x) * Mathf.Rad2Deg * 2f;

        angleX = Mathf.Clamp(angleX,minX,maxX);

        q.x = Mathf.Tan(angleX * Mathf.Deg2Rad * 0.5f);

        return q;
    }
}

 

インスペクターで3項目設定をします。

Camはカメラを設定します。

ターゲットは男の子を設定します。

Animは待機モーションの時にアタッチしたAnimatorを設定します。

この状態だとこんな感じになります。

本当にWASDでただ動けるといった感じですね。

歩行アニメーションもなくただスライドしているだけですね。

マウスで方向転換はできているみたいです。

 

ここから、前に歩くときにアニメーションを再生させてみたいと思います。

こんな感じで歩いているモーションをblenderで作成してみました。

こちらをunityにインポートします。

 

待機モーションのときに作成したアニメーションコントローラーに新しく作成した歩行アニメーションをドラッグアンドドロップします。

 

続いてパラメータータブを選択してWalkfowardパラメーターを作成してください。W押しているときにモーションを変えたいのでBool型でいいかな。

 

そうしたら待機モーションにカーソルを持って行って左クリック→遷移を作成にすると、矢印が出てくるのでWalkfowardにつなげます。

 

つないだ矢印をクリックしてインスペクターを開きます。3つの項目を変更していきます。

終了時間ありのチェックを外します。これはアニメーションが切り替わるときに何秒後に切り替わるかの項目です。

例えば今はWを押したときに前に歩くモーションを再生しようとしているので、Wを押してからどれくらいでアニメーションがstandidleからwalkfowardに変わるかということです。

今回は押した瞬間に切り替わってほしいのでチェックを外します。

次は遷移間隔です。こちらはアニメーションとアニメーションの切り替えを即座に行うのか、時間のかけて行うのかの設定です。

数字を大きくするほど間隔が長く、繋ぎ目がなめらかになります。

0にすると即座に切り替わり、動きがカクカクします。アイドルから歩行なら即座でもいいですが、一応0.2くらいで設定しました。

 

そしてconditionsの設定をします。こちらはアニメーションが切り替わるためのトリガーを設定しています。

+を押してWalkfoward、trueにしてください。これでパラメーターWalkfowardがtrueの時にアニメーションが切り替わってくれます。

 

続いて歩き状態から待機状態にアニメーションを切り替える設定をします。

上記の要領でwalkfowardからstandidleに矢印を引っ張ってください。

つながった矢印をクリックしてインスペクターを開きます。

さっきと設定を変える部分はconditionsの部分でWalkfoward、falseにしてください。

こんな感じ。

これでWalkfowardがtrueのときは歩行アニメーション、Walkfowardがfalseの時は待機アニメーションにする設定ができました。

 

次は、Wを押している間はWalkfowardをtrueにして、押していない間はWalkfowardをfalseにするスクリプトを記述していきます。

 


    void Update()
    {
        float xRot = Input.GetAxis("Mouse X") * Ysensityvity;
        float yRot = Input.GetAxis("Mouse Y") * Xsensityvity;

        cameraRot *= Quaternion.Euler(-yRot, 0, 0);
        characterRot *= Quaternion.Euler(0, xRot, 0);

        cameraRot = ClampRotation(cameraRot);

        //上下カメラ
        cam.transform.localRotation = cameraRot;
        //左右カメラ
        transform.localRotation = characterRot;


        UpdateCursorLock();
        
        // 新しく追加
        if (Input.GetKey(KeyCode.W)) 
        {
            Anim.SetBool ( "Walkfoward", true );
        }
        else
        {
            Anim.SetBool ( "Walkfoward", false );
        }


    }

この状態でプレイしてみるとこんな感じです。

 

 

W押したときはいい感じにアニメーションできました。

あとはASDに対応するアニメーションを作成して同じように対応させたいと思います。

といっても、右と左に歩くモーションは前に歩くモーションを90度回転させたものでOKだと思います。

Blederで向きを回転させて、A、Dの対応させるアニメーションを作成します。

作成したアニメーションをインポートするのですが、注意点が1つあります。

基準をボディの向きからオリジナルにしてください。

そうしないと回転させたアニメーションが回転しない状態で再生されてしまいます。

さらに下のルートトランスフォーム位置(Y)はオリジナルから足に変更したほうがいいです。

アニメーション作成時にZ座標(高さ)を0にしても足が地面にめり込むなぁと思っていたところ、こちらを変更したら治りました。

 

そうしたら画像の通りアニメーションコントローラーを設定します。

矢印の設定もします。他の部分も同じように設定してください。反対向きの矢印はconditionsをfalseにするのを忘れないように。

これでこんな感じに動けたらOKです。

 

そうしたらあとは後ろ向きに歩くモーションだけですね。

前に歩くモーションを180度回転させたものでもいいですが、あとで一人称視点にしたときに体は後ろ向き、顔(視点)は前のままという怖いことになってしまうので

後退りするような専用アニメーションを作成したいと思います。

こんなもん?笑

 

さっそくunityにインポートします。

 

他のアニメーションと同様に設定。

その結果がこちらになります。

悪くない悪くないっ!

欲を言えば斜めに歩くアニメーションも欲しいですが、今回は割愛します。やることは同じはずなので。

 

では最後に、カメラをキャラクター目線に変更したいと思います。

やりかたは簡単。ヒエラルキーのカメラをキャラの子要素にするだけです。

 

これで完成です。

 

 

がくっとゲームっぽくなりましたね。

画面に移ってるものすべてが自分で用意したものだと考えると、結構これだけで感動しています笑

次回はイスにキャラクターを座らせてみたいと思います。

すらでした。


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)