Unityでゲーム、アプリ開発

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

Unity 敵キャラの配置とダメージ処理と体力の実装、ランゲームを作ろう③ 3Dゲーム作り⑦

今回は、ランゲームを作っていくのに必要なダメージ処理と、
体力の実装方法について書いていきます。


敵キャラの配置とダメージ処理と体力の実装、ランゲームを作ろう③

f:id:Phoenix9056:20200423200045p:plain

ランゲーム③と言う事で前回の続きからになっています。
前回の記事が気になる方は下記リンクより覗いてみてください。

www.unityprogram.info


f:id:Phoenix9056:20200423201007p:plain

前回に引き続きNejiko Runアセットを使用して行なっていきます。
※一応アセットのダウンロード場所を下記に貼っておきます。
unitylist.com

始めに、Project内にある、Nejiko Run master⇨Assets⇨①Prefabsをクリックして、
②DefaultStageを④のScene内にドラッグ&ドロップしましょう。
※③無くてすみません笑笑

⑤の様に名前をStage1に変更します。
Stage1Inspector内のPositionの値を⑥の様に、X⇨15にして横に並べて見やすくします。


f:id:Phoenix9056:20200423201843p:plain

次にProject内⇨Nejiko Ran master⇨Assets⇨Prefabs⇨①Roboをクリックします。
②のRoboBasicをドラッグして③のScene画面にドロップしてください。

次にHierarchy内の④の様にStage1RoboBasicをドラッグ&ドロップして
Stage1の子要素にします。

RoboBasicInspector内の⑤のタグがRoboになっているか確認してください。
後にスクリプト記述でタグRoboを指定します。
オリジナルで敵キャラを使用している場合はTagRoboを追加して指定するか
後ほどのスクリプトを変えて見てください。

TransformPositionZを15にしてStage1の真ん中に立たせます。
RotationYを180にして再生した時にキャラクターと向かい合わせになる様にしましょう。


f:id:Phoenix9056:20200423210021p:plain

Hierarchy内にある①のStage1
Project内の自分が分かりやすい所にドラッグ&ドロップして
プレハブ化します。

Hierarchy内の①のStage1はもう要らないので、
右クリック⇨Dereteから消してしましましょう。


f:id:Phoenix9056:20200423210417p:plain

Hierarchy内にあるキャラクターにアタッチされた
CharaMoveスクリプトの記述に追加していくのですが、
前回の続きでやっている方はスクリプトの記述を一回消して
コピーアンドペーストするか同じ記述にしてください。

初めての方は、スクリプトCharaMoveと言う名前にして、
記述した後にキャラクターにアタッチして③の様に値を変えて見てください。
ただ、アニメーションの設定でのスクリプトの内容になっているので
下記記事を参考にしてアニメーションを設定して見てください。
www.unityprogram.info

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;
    const int DefaultLife = 3;
    const float StunDuration = 0.5f;

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

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

    //それぞれのパラメーターの設定をInspectorで変える様にします。
    public float gravity;
    public float speedZ;
    public float speedX;
    public float speedJump;
    public float accelerationZ;

    //ライフを取得する関数
    public int Life ()
    {
        return life;
    }

    public bool IsStan ()
    {
        //気絶判定処理
        return recoverTime > 0.0f || life <= 0;
    }
    
    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();

        //気絶した時の処理
        if (IsStan())
        {
            //動きを止めてライフを減らして復帰カウント。
            moveDirection.x = 0.0f;
            moveDirection.z = 0.0f;
            recoverTime -= Time.deltaTime;
        }
        else
        {
            //徐々に加速してZ方向に常に加速させる。
            float acceleratedZ = moveDirection.z + (accelerationZ * Time.deltaTime);
            moveDirection.z = Mathf.Clamp(acceleratedZ, 0, speedZ);
            //X方向は目標のポジションまでの差分の割合で速度を計算。
            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);
        //移動後接地していたらY方向の速度はリセットする。
        if (controller.isGrounded) moveDirection.y = 0;
        //速度が0以上なら走っているフラグをtrueにする。
        animator.SetBool("run", moveDirection.z > 0.0f);
        
    }

    //新しく作った関数のそれぞれの処理。
    //左のレーンに移動。
    public void MoveToLeft()
    {
        //気絶時の入力をキャンセルします。
        if (IsStan()) return;
        if (controller.isGrounded && targetLane > MinLane) targetLane--;
    }
    //右のレーンに移動。
    public void MoveToRight()
    {
        if (IsStan()) return;
        if (controller.isGrounded && targetLane < MaxLane) targetLane++;
    }
    //ジャンプ時の処理。
    public void Jump()
    {
        if (IsStan()) return;
        if (controller.isGrounded)
        {
            //Y方向に数値分だけ力を加えます。
            moveDirection.y = speedJump;
            //トリガーで設定されているアニメーションjumpを実行します。
            animator.SetTrigger("jump");
        }
    }
    //CharacterControllerにコライダーが当たった時の処理。
    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if(IsStan()) return;
        if(hit.gameObject.tag == "Robo")
        {
            //ライフを減らして気絶状態に移行します。
            life--;
            recoverTime = StunDuration;
            //トリガーで設定したdamageアニメーションの実行。
            animator.SetTrigger("damage");
            //hitしたオブジェクトは削除
            Destroy(hit.gameObject);
        }
    }

}


f:id:Phoenix9056:20200423231427p:plain

最後に、Hierarchy内にあるStageオブジェクトをクリックして
その中にアタッチされている③のStageスクリプト
Stage TipsElement0に先ほどプレハブ化した
Stage1をドラッグ&ドロップして完成です。
※コレも前回の記事でスクリプトを作っているので参考にして見てください。

それでは再生して見ましょう!

と言いたい所なのですが前回の記事でMixamoからdamege
アニメーションを設定した人や、注意点が有ます。

f:id:Phoenix9056:20200423232050p:plain

アニメーションの設定でRigをクリックして、
Animation TypeHumanoidに変更してキャラクターと連動できる様にしてください。
ここを変えて無くて再生したらキャラクターが敵に当たる度に地面に埋まりました笑笑
※キャラクターのAnimation TypeHumanoidだった時に限ります。


f:id:Phoenix9056:20200423232450g:plain

上手くダメージ食らって3回目に停止したでしょうか?

今回はこんな感じで終わりますが敵キャラクターの
いろんな配置であったりライフポイントの画像の設置なんかも
やっていきたいと思います。

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


関連記事

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

※オススメの無料アセットは下記カテゴリより。便利なアセットが有ます。
www.unityprogram.info

※Unityを学習していきたい方は下記カテゴリを覗いて見てください。
www.unityprogram.info

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

※初心者に向けた簡単な記事は下記カテゴリより。
www.unityprogram.info