Unity

【Unity】RobotKyleでいろいろ~その3~ 基本動作にAnimationをつける

投稿日:2020年10月3日 更新日:

概要

前回はRobot Kyleをキーボード操作で移動とジャンプができるようにしました。

今回はさらに動作にアニメーションをつけていきたいと思います。


環境

Windows10
Unity 2020.1.f1

Step1 : Animationの 入手

まずはRobot Kyleを動かすためのAnimationを入手します。今回はAsset Storeから以下のThird Persion ControllerのFree版を使用させてもらいました。

https://assetstore.unity.com/packages/tools/utilities/third-person-controller-basic-locomotion-free-82048

上記のリンク先からパッケージをダウンロードし、デフォルトのすべてがチェックが入った状態でパッケージをUnityのProjectへインポートします。


Step2 : SimpleAnimationの取得

今回はAnimationの制御にSimpleAnimationを使用します。

https://github.com/Unity-Technologies/SimpleAnimation

MIT License
Copyright (c) 2017 Unity Technologies
https://github.com/Unity-Technologies/SimpleAnimation/blob/master/LICENSE


上記からSimpleAnimationをダウンロードし、その中のSimpleAnimationComponentをUnity Projectにインポートします。(Windowsのフォルダからドラッグ&ドロップで持ってくるだけ)

次にSimpleAnimationComponentのなかのSimpleAnimations.csをRobotKyleへアタッチします。


Step3 : Inspectorの設定

続いて、RobotKyleのInspectorの設定を行っていきます。

Rigの設定

RobotKyleモデルのRigからAnimatin TypeをHumanoidに設定します。これはThirdPersonControllerのAnimationを使用するためです。

設定したら忘れずにApplyを押します。


Animatorの設定

次にAnimatorの設定を行います。AvatarでRobot KyleAvatorを選択します。


SimpleAnimationの設定

次にSimpleAnimationで制御する項目と、ThirdPersonControllerのAnimationを対応付けていきます。Inspector内のSimpleAnimation(Script)を以下のように設定します。

最初のAnimationの項目を選択し、ThirdPersonControllerのパッケージからIdleのAnimationを選択します。

次に、Sizeを”4″に変更し、Element1からElement3に対してRun、Sprint、Jumpを同様に設定します。

ThirdPersonControllerからIdleを選択する例

以上でInspectorの設定は完了です。

Step4 : Animationを制御するスクリプトの作成

前回作成したスクリプトに以下を追加します。

SimpleAnimationの定義

SimpleAnimation simpleAnimation;

Jump、Run、Sprintの制御

  • 上下キー+スペースキーでJumpアニメーション実行
  • 上下キー+左シフトキーでSprintアニメーション実行
  • Jump中でない場合に上下キーでRunアニメーション実行
  • スペースキーでJumpAnimation実行
  • その他はDefault(Idle)アニメーション実行
if (Input.GetButton("Vertical"))
        {
            //Run & Jump
            if (inJumping || Input.GetKey(KeyCode.Space))
            {
                simpleAnimation.CrossFade("Jump", 0.1f);
                inJumping = true;
            }
            else if (Input.GetKey(KeyCode.LeftShift))
                simpleAnimation.CrossFade("Sprint", 0.1f);
            else
            {
                if (inJumping)
                    simpleAnimation.CrossFade("Jump", 0.1f);
                else
                    simpleAnimation.CrossFade("Run", 0.1f);
            }

        }
        else if (Input.GetKey(KeyCode.Space))
        {
            simpleAnimation.CrossFade("Jump", 0.1f);
            inJumping = true;
        }
        else
        {
            if (inJumping) { }
            else
            {
                simpleAnimation.Play("Default");
            }
        }

地面接地時の制御

  • Groudに接触したらJumpアニメーションを停止し、Default(Idle)アニメーションを実行
void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag == "Ground")
        {
            onGround = true;
            inJumping = false;

            simpleAnimation.Stop("Jump");
            simpleAnimation.Play("Default");
        }
    }


前回作成したスクリプトと合わせた全コードは以下になります。これをRobotKyleにアタッチしたら完了です。

PlayCon.cs

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

public class PlayerCon : MonoBehaviour
{
    // Start is called before the first frame update

    //Status
    [SerializeField] public bool onGround = true;
    [SerializeField] public bool inJumping = false;
 

    //rb Variable
    Rigidbody rb;

    //Run speed
    float speed = 6f;

    //Sprint speed
    float sprintspeed = 9f;

    //Angle change speed
    float angleSpeed = 200;

    //variable
    float v;
    float h;

    //Defining SimpleAnimation
    SimpleAnimation simpleAnimation;

    void Start()
    {

        //Getting rb component
        rb = this.GetComponent<Rigidbody>();

        //To Avoid Rotating body.
        rb.constraints = RigidbodyConstraints.FreezeRotation;

        //Getting SimpleAnimation Component
        simpleAnimation = GetComponent<SimpleAnimation>();


    }

    // Update is called once per frame

    void Update()
    {

        //Left Shift key can make character sprint run.
        if (Input.GetKey(KeyCode.LeftShift))
            v = Input.GetAxisRaw("Vertical") * Time.deltaTime * sprintspeed;
        else
            v = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed;


        //It can't be moved in Attacking or Jumping
        if (!inJumping)
        {
            if (v > 0)
            {
                transform.position += transform.forward * v;
            }
            else
            {
                transform.position += transform.forward * v / 3;
            }
        }

        //Horizontal Movement
        h = Input.GetAxisRaw("Horizontal") * Time.deltaTime * angleSpeed;
        transform.Rotate(Vector3.up * h);

        //Jumping Movement
        if (Input.GetKey(KeyCode.Space) &amp;&amp; onGround)
        {
            //Initialize velocity
            rb.velocity = new Vector3(0, 0, 0);

            //Adding Force upfoward to Jump
            rb.AddForce(transform.up * 300);

            //When character is in Spinrt, the force is stronger than normal to up&amp;foward 
            if (Input.GetKey(KeyCode.UpArrow) &amp;&amp; Input.GetKey(KeyCode.LeftShift))
                rb.AddForce(transform.forward * 250);

            //When character is in run, the force is to up&amp;foward
            else if (Input.GetKey(KeyCode.UpArrow))
                rb.AddForce(transform.forward * 180);
 
            //When character is running back, the force is to backward
            else if (Input.GetKey(KeyCode.DownArrow))
                rb.AddForce(transform.forward * -100);
            
            //when jumping, the onGround flag is false.
            onGround = false;
        }


        //animation
        if (Input.GetButton("Vertical"))
        {
            //Run &amp; Jump
            if (inJumping || Input.GetKey(KeyCode.Space))
            {
                simpleAnimation.CrossFade("Jump", 0.1f);
                inJumping = true;
            }
            else if (Input.GetKey(KeyCode.LeftShift))
                simpleAnimation.CrossFade("Sprint", 0.1f);
            else
            {
                if (inJumping)
                    simpleAnimation.CrossFade("Jump", 0.1f);
                else
                    simpleAnimation.CrossFade("Run", 0.1f);
            }

        }
        else if (Input.GetKey(KeyCode.Space))
        {
            simpleAnimation.CrossFade("Jump", 0.1f);
            inJumping = true;
        }
        else
        {
            if (inJumping) { }
            else
            {
                simpleAnimation.Play("Default");
            }
        }
    }

    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag == "Ground")
        {
            onGround = true;
            inJumping = false;

            simpleAnimation.Stop("Jump");
            simpleAnimation.CrossFade("Default",0.1f);
        }
    }
}

動かしてみると以下のような感じになります。

Run

Sprint


Jump


まとめ

今回はRobotKyleにThirdPersonControllerを使って動きを与える方法について紹介しました。次回はさらにRobotyKyleにソードを持たせて攻撃する動きを実現したいと思います。

-Unity

執筆者:


  1. […] 前回はRobot Kyleにキーボードで基本動作ができるようにしましたが、今回はRobotKyleに武器(レーザーソード)を持たせたいと思います。 […]

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

UnityでNon-convex MeshCollider with non-kinematic Rigidbody is no longer supported since Unity 5.が出た時の対処法

Contents1 概要2 環境3 エラー内容4 対処法15 対処法2 概要 UnityでAsset Storeからフリーの武器をダウンロードして使用していたら、以下のエラーがでたのでその対処方法につ …

ゲームエンジンUnityをWindowsへインストール

Contents1 目的2 環境3 Step1 : Unity Hubのダウンロード4 Step2 : Unity Hubのインストール5 Step3 : Unity 本体のインストール6 まとめ 目 …

【Unity】Package ManagerでMy Assetsが取得できないときの対処

Contents1 目的2 環境3 症状4 対処法 目的 Unity のPackage Manager でMy Assetesを取得したり、Unity Asset Storeに繋らない症状が発生したの …

【Unity】RobotKyleでいろいろ~ その2~ キーボードで操作する

Contents1 概要2 環境3 やりたいこと4 Step1 : コンポーネントの追加4.1 Rigidbodyの追加4.2 Colliderの追加5 Step2 : Main Cameraの設定6 …

【Unity】既存のAnimationをRead-Onlyから編集できるようにする

Contents1 概要2 環境3 Read-Onlyになる事象4 Read-Onlyを回避する方法 概要 Unityで既存のAnimationをキャラクターにAttachする際、Animationで …

言語切り替え

カテゴリー