Unity

Unityの便利機能を使いこなそう #3 AnimatorControllerでキャラをヌルヌル動かそう

投稿日:2019年1月4日 更新日:

AnimatorControllerの説明

名前の通りキャラクターのアニメーションを切り替えます
例えば何もしてない時は、待機アニメーションにしたり、移動キーがおされたら、走るアニメーションに切り替えたりします
切り替えは変数を使って行います

AnimatorControllerの作成

まずは、AnimatorControllerを作成します
画像のように、右クリック → Create → AnimatorControllerで作成します
1-1

続いて、Playerと名前をつけて、プレイヤーにD&Dします
2

AnimatorControllerの設定

AnimatorControllerにアニメーションをいれる

作成したAnimatorControllerをダブルクリックして開き、各アニメーションのデータをD&Dします
3-1

アニメーションの名前を変更する

D&Dしたアニメーションを選択し、名前を分かりやすいように変更します
今回は待機アニメーションをWait、走るアニメーションをRun、攻撃アニメーションをAttackに変更しました
4-1

アニメーションが繰り返し再生するようにする

アニメーションには繰り返し再生するものと単発で終わるものがあります
繰り返し再生するもの(今回の場合は待機、走り)はアニメーションをダブルクリックし、Loop Timeにチェックをいれます
5-1

アニメーションを矢印で結びつける

アニメーションは矢印で結んで遷移させます
今回は待機→走り、待機→攻撃、走り→攻撃、走り→待機、攻撃→待機とつなぎます
まずは待機で右クリックし、Make Transitionをおします
6-1

続いて、走りの方まで矢印をひっぱり、走りで左クリックして確定します
7

同様に待機→攻撃、走り→攻撃、走り→待機、攻撃→待機もつなぎましょう
8

アニメーションを遷移させる変数をつくる

アニメーションの遷移は変数で管理します
そのための変数を作ります
+をおして、変数の型をBoolにします
9
変数の名前はRunにしておきます
10
同様にAttackという変数も作りましょう
11

アニメーションを遷移させる条件を設定する

各変数がどうなっていたら遷移をするのかを設定します
まずは、待機→走りの矢印を選択します
そうすると右側に設定画面が開くので、Has Exit Timeのチェックを外します
Has Exit Timeはチェックを付けた場合、前のアニメーションを最後まで再生してから切り替えます
チェックを外した場合は、遷移の条件が切り替わった時に、前のアニメーションを中断して次のアニメーションに切り替わります
Conditionsは+をおしてRunをtrueにします

同様に走り→待機、待機→攻撃、攻撃→待機の条件も設定します
設定の条件は以下の通りです

設定した変数をスクリプトで制御する

Unityのコンポーネントを制御する場合、
①コンポーネントの機能を代入する変数を作成
②コンポーネントの値を作成した変数に代入
③実際に値を操作
という手順を踏みます

スクリプトにコメントでそれぞれの該当する部分を書いておきましたので参考にしてください
例としてこちらの一番最初にあるスクリプトに追記しています
簡単に説明するとWASDキーで移動している時はRunをtrue、キーが離された時はRunをfalse、
同様に攻撃のボタンであるマウスが左クリックされたらAttackがtrue、離されたらAttackがfalseになるようになっています

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

public class Player : MonoBehaviour
{
    private CharacterController characterController;
    private Vector3 Velocity;
    [SerializeField]
    private float JumpPower;
    [SerializeField]
    private float MoveSpeed;
    private Animator animator;//①コンポーネントの機能を代入する変数を作成
    
// Use this for initialization
    void Start()
    {
        characterController = GetComponent();
        Velocity = Vector3.zero;
        animator =GetComponent();//②コンポーネントの値を作成した変数に代入
    }

    // Update is called once per frame
    void Update()
    {
        characterController.Move(Velocity);

        if (Input.GetKey(KeyCode.W))
        {
            transform.rotation = Quaternion.Euler(0, 0, 0);
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);
            animator.SetBool("Run", true);//③Runをtrueにする
        }
        
        else if (Input.GetKeyUp(KeyCode.W))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }
        
        if (Input.GetKey(KeyCode.S))
        {
            transform.rotation = Quaternion.Euler(0, 180, 0);
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);
            animator.SetBool("Run", true);//③Runをtrueにする        
        }

        else if (Input.GetKeyUp(KeyCode.S))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }        
        
        if (Input.GetKey(KeyCode.A))
        {
            transform.rotation = Quaternion.Euler(0, 270, 0);
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);
            animator.SetBool("Run", true);//③Runをtrueにする        
        }
        
        else if (Input.GetKeyUp(KeyCode.A))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }       
        
        if (Input.GetKey(KeyCode.D))
        {
            transform.rotation = Quaternion.Euler(0, 90, 0);
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);
            animator.SetBool("Run", true);//③Runをtrueにする        
        }

        else if (Input.GetKeyUp(KeyCode.D))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        } 
        
        Velocity.y += Physics.gravity.y * Time.deltaTime;

        if (characterController.isGrounded)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Velocity.y = JumpPower;
            }
        
            if (Input.GetMouseButtonDown(0))
            {
                animator.SetBool("Attack",true);//③Attackをtrueにする
            }
        
            else if (Input.GetMouseButtonUp(0))
            {
                animator.SetBool("Attack",false);//③Attackをfalseにする
            }
        }
    }
}

 

テストプレイしてみるとこんな感じです♪

走っている時は、走っているアニメーション、攻撃や待機ポーズもバッチリですね

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

-Unity

執筆者:


  1. […] アニメーションの遷移(AnimatorController) […]

comment

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

「ゲームが作れる!」と言い切れるようになるために

さて、僕は子どもにゲーム作りを教えてそれによって子どもの表現力を伸ばすという仕事をしています。 その過程でまず習得に必要なツールとして、 ①Scratch これはプログラミングに必要な最低限の知識を習 …

Unityでスマホ対応のVRを作ろう

今回やること VR空間の宝島を冒険して宝を探すゲームをUnityで作ります バージョンは2018でやっていますが恐らく他のバージョンでも問題ないと思います VR用のカメラを入れる UnityRemot …

blenderで火の鳥のロビタを作ってみた

さて、休日というものは得てして暇なものです そんな時はなんとなくPCで適当にものづくりしてみる 何しよっかなーと考えた結果、最近手塚治虫大先生の火の鳥を読み返しているのでその中に出てくるロビタを作って …

no image

加速度センサーWebテスト

Unityをダウンロードしよう

今回やること Unityをダウンロードして使えるようにします macでもWindowsでも使えますので是非ダウンロードしてみましょう Unityのダウンロード こちらからUnityのダウンロードページ …

ゲタバコ倶楽部へようこそ

  • 300741総閲覧数:
  • 24今日の閲覧数:
  • 231534総訪問者数:
  • 21今日の訪問者数:

住所
Akita,Japan

営業時間
月~日: 10:00 AM – 10:00 PM

このページはゲタバコ先生の日々思うことや活動、プログラミングの習得方法を発信するページです。
仕事のご依頼、メッセージ等、サービス概要をご覧の上で、お気軽にご連絡ください。

getabakosensei@gmail.com