Unityでゲーム、アプリ開発

Unityで初めてゲームやアプリを作る人のための支援ブログです。

Unity ランゲームの作り方!自動で前進して左右に動いてカメラを追いかけさせよう! 3Dゲーム作り⑤

今回はランゲームの作成において、キャラクターが自動で前進して
横に4マスずつ動いてカメラが追いかけていく方法を説明していきます。

※ブログ記事では分かりにくい方は下記動画をご覧ください。
記事での説明がいい方はそのまま読み進めてください。

youtu.be


ランゲームの作り方!自動で前進してカメラを追いかけさせよう!

f:id:Phoenix9056:20200420122229p:plain

ランゲーム作りにおいての第一歩の様な形で入っていきます。
今回キャラクターも自分で好きな物を選んでアニメーションなんかも
作っていく様にしてあります。

Unityのプロジェクトは3Dで開いてください。


f:id:Phoenix9056:20200420122519p:plain
完成してある画像からの説明になりますが気になさらずに笑笑。

まずHierarchy内にある①のクリック⇨3D Object⇨Cubeと選択して
②のCubeを作成してください。

次にCubeInspector内にある、Scaleの値を
X=6,Y=1,Z=1000にして画面に表示されているような
長い地面にしていきます。


f:id:Phoenix9056:20200420123042p:plain

次にキャラクターの設置になっていきます。自分が好きなキャラクターを用意するか、
僕は今回Mixamoと言うサイトからキャラクターを取り込んでいます。
※Mixamoの使い方は下記記事を参考にしてください。
www.unityprogram.info

もし僕の様にMixamoからインポートしていたら、
Inspector内の②のRigをクリックして、Animation TypeHumanoidにして、
Avatar DefinitionCreate From This Modelを選択してアバターを作っておきます。

①のキャラクターをScene内の先程作ったCubeの上に設置していきましょう。

f:id:Phoenix9056:20200420124012p:plain

キャラクターのInspector内の一番下のAdd Componentから、
①のAnimatorと②のCharacter Controllerを追加して、
Character Controllerの値はキャラ毎に違うので包みこむ様に
自分で設定してください。


f:id:Phoenix9056:20200420124458p:plain

Projectの自分が分かりやすい所で右クリック⇨Create⇨Animator Controller
クリックして①のAnimator Controllerを作成して名前は今回Moveにしました。
①をダブルクリックしてAnimator画面を開きます。

※今回簡単に説明していきますのでアニメーションの作り方が
全然わからない人は下記記事を参考にしてください。

www.unityprogram.info

②のParameterの内容ですが、+をクリック⇨Boolで名前をrun
Triggerで名前をjump、またTriggerで名前をdamageとして作ります。
名前は必ず小文字で今回作ったのでその通りにしてください。
後のスクリプトにこの名前を使って動かす様にします。

f:id:Phoenix9056:20200420125709p:plain

③のアニメーションのMake Transition(矢印)の方向は
上記の画像の様に設定してください。
それぞれのアニメーションのMotionは好きな物を設定してください。

僕は今回次のアセットからジャンプと走る、アイドルを取得しました。
f:id:Phoenix9056:20200420125944p:plain

Basic Motion FREE Pack

名前を検索してインポートするか、下記リンクから飛んでください。
assetstore.unity.com

そうすると困ったのがdamageのアニメーション。
Mixamoで僕はHitと検索したらダメージアニメーションが
たくさん出てきたのでインポートしました。

そしたら次は、Make Transitionで繋げた矢印の中のInspectorの設定を
説明していきます。

Make TransitionEntry⇨Idleは何も無し。
idle⇨runはHas Exit Timeのチェックを外してConditionはran,true。
run⇨idleはチェックを外してrun,false。
idle⇨jumpはチェックを外してjump。
jump⇨idleはチェックを入れたままrun,false。
jump⇨runはチェックを入れたままrun,true。
run⇨jumpはチェックを外してjump。
Any State⇨damageはチェックを外してdamage。
damage⇨idleはチェックを入れたままrun,false。
damage⇨runはチェックを入れたままrun,true。

上手く設定できたでしょうか?


f:id:Phoenix9056:20200420132142p:plain

今度はHierarchy内にあるキャラクターをクリックして、
①の先程作成したMoveInspector内にあるAnimator
②のControllerにドラッグ&ドロップしてください。

次にProject内の自分の好きな所で、右クリック⇨Create⇨C# Scriptをクリックして
③のスクリプトを作成します。
名前はCharaMoveにします。

次のコードをコピー&ペーストするか同じ記述で作成してください。

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

public class CharaMove : MonoBehaviour
{
    //レーンの移動の数値をそれぞれの変数で宣言します。
    const int MinLane = -2;
    const int MaxLane = 2;
    const float LaneWidth = 1.0f;

    //CharacterController型を変数controllerで宣言します。
    CharacterController controller;
    //Animator型を変数animatorで宣言します。
    Animator animator;

    //それぞれの座標を0で宣言します。
    Vector3 moveDirection = Vector3.zero;
    //int型を変数targetLaneで宣言します。
    int targetLane;

    //それぞれのパラメーターの設定をInspectorで変える様にします。
    public float gravity;
    public float speedZ;
    public float speedX;
    public float speedJump;
    public float accelerationZ;
    
    void Start()
    {
        //GetComponentでCharacterControllerwp取得して変数controllseで参照します。
        controller = GetComponent<CharacterController>();
        //GetComponentでAnimatorを取得して変数animatorで参照します。
        animator = GetComponent<Animator>();
    }

    
    void Update()
    {
        //それぞれの矢印が押されたらそれぞれの関数を実行します。
        if (Input.GetKeyDown("left")) MoveToLeft();
        if (Input.GetKeyDown("right")) MoveToRight();
        if (Input.GetKeyDown("space")) Jump();

        float acceleratedZ = moveDirection.z + (accelerationZ * Time.deltaTime);
        moveDirection.z = Mathf.Clamp(acceleratedZ, 0, speedZ);

        float ratioX = (targetLane * LaneWidth - transform.position.x) / LaneWidth;
        moveDirection.x = ratioX * speedX;

        moveDirection.y -= gravity * Time.deltaTime;

        Vector3 globalDirection = transform.TransformDirection(moveDirection);
        controller.Move(globalDirection * Time.deltaTime);

        if (controller.isGrounded) moveDirection.y = 0;

        animator.SetBool("run", moveDirection.z > 0.0f);
        
    }

    //新しく作った関数のそれぞれの処理。
    public void MoveToLeft()
    {
        if (controller.isGrounded && targetLane > MinLane) targetLane--;
    }

    public void MoveToRight()
    {
        if (controller.isGrounded && targetLane < MaxLane) targetLane++;
    }

    public void Jump()
    {
        if (controller.isGrounded)
        {
            moveDirection.y = speedJump;

            animator.SetTrigger("jump");
        }
    }

}

出来上がった③のCharaMoveスクリプトHierarchy内にある④の
キャラクターにドラッグ&ドロップしてアタッチしてください。

④のキャラクターのInspectorから先程アタッチした
スクリプトの⑤の値を画像と同じ様に設定してください。


f:id:Phoenix9056:20200420134140p:plain

さぁ!コレが最後の作業です!

カメラが追いかけるスクリプトを作っていくので、Project内で
右クリック⇨Create⇨C# Scriptを選択して①のスクリプトを作ります。
名前は、Followにします。

次のコードをコピー&ペーストするか同じ記述で書いてください。

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

public class Follow : MonoBehaviour
{
    //Vector3型を変数vectorで宣言します。
    Vector3 vector;

    //GameObject型を変数Targetで宣言します。
    public GameObject target;
    //float型を変数followSpeedで宣言します。
    public float followSpeed;
   
    void Start()
    {
        //位置をTargetの位置を元に設定するよ。
        vector = target.transform.position - transform.position;
    }

    
    void Update()
    {
        //位置を取得してスピードも合わせていくよ。
        transform.position = Vector3.Lerp(
            transform.position,
            target.transform.position - vector,
            Time.deltaTime * followSpeed);
    }
}

出来上がった①のFollowスクリプトを、Hierarchy内にある
②のMain Cameraにドラッグ&ドロップしてアタッチしてください。

次に②のMain CameraInspector内の④のTargetの部分に、
③のキャラクターをドラッグ&ドロップして追いかける様にします。
最後にFollowSpeedの値を5に設定して完成です。

再生してみましょう!!

キーボードの矢印の左右で動いてスペースキーで
ジャンプができてキューブから落ちない様になっているはずです。
f:id:Phoenix9056:20200420135311g:plain

また、ステージの自動生成やライフやスコアの実装の仕方も
書いていくので気に留めてください!

ご視聴ありがとうございました。


※Unityで本格的に3Dゲームを作っていきたい方は下記カテゴリをご覧ください。
www.unityprogram.info

※実際に使ってみみたオススメの学習本は下記カテゴリから覗いてみてください。
www.unityprogram.info

※オススメのアセットの紹介は下記カテゴリから。気に入るかと思います。
www.unityprogram.info

※Unityを学習していきたい方は下記カテゴリより。少しめんどくさい記事があります。
www.unityprogram.info

※初心者に向けた簡単な記事や基本的なカテゴリは下記よりみてください。
www.unityprogram.info