LoginSignup
1
3

More than 5 years have passed since last update.

Unityを習得していくための 3Step チュートリアル #1 terrainでフィールドを作成、CharacterControllerでのプレイヤーの移動、ジャンプ、Animatorでのアニメーションの遷移

Last updated at Posted at 2019-01-18

使うプレイヤーはこちらにありますので、素材欲しい方はダウンロードして下さい

Terrainでフィールドを作成

Terrainはゲームの地形を作るツールです
画像のような地形を簡単に作ることができます
15

Terrainを出す

画像のようにCreateをおして3D ObjectからTerrainを選択します
①-1.png

真っ白な地面が出たと思います
6.png

テクスチャーを貼る

このままでは真っ白で味気ないのでテクスチャーを貼ります
テクスチャーは素材名(英語) textureとかで検索してダウンロードして下さい

例えば…草原なら grass texture、岩場なら rock texture、砂なら sand texture

ダウンロードしたテクスチャーは画像のようにAssetsをおしてImport New Assetをおして貼りたいテクスチャーを選びます
4

そうしたらTerrainを選択し、右側の筆のアイコンをおして、EditTextureをおします
5

EditTexturesをおして、左上に出るSelectをおして、Addをおします
dテクスチャーのサイズはSizeのXとYをいじると変えられます
6

全体に選択したテクスチャーが貼られました
7

テクスチャーを追加する

このままだと全部草原になってしまうので先程のように必要なテクスチャーをダウンロードして入れましょう
追加の仕方も先程と同じです。土と、岩を追加してみました
8

画像のように好きな筆とテクスチャを選択すれば、地形を好きなテクスチャで塗ることが出来ます
9

地形を作る

画像のように各ブラシを選んで地形を作っていきましょう
一番左のブラシは尖った山になり、その右のブラシは頂上が平らになります。
10

今回はこんな感じにしてみました♪
11

CharacterControllerの説明

今回はCharacterControllerというものを使って、プレイヤーの移動とジャンプを実装していきたいと思います

CharacterControllerとは?

①取り付けたオブジェクトにはカプセル状の当たり判定(CapsuleCollider)がつく
②傾斜や段差の判定を自動で行ってくれる

とりあえず、3D空間をいい感じに歩き回れてジャンプとかもさせたいんだ!という方にオススメです

素材を入れる

こちらよりダウンロードして使って下さい
とりあえずはプレーンな棒人間にしてあるのでUnityの操作に慣れたら是非自分で作ってみて下さい

プレイヤーをフィールドに出す

画像のようにプレイヤーの待機アニメーションをドラッグ&ドロップします
1

プレイヤーとカメラの位置を調整する

赤枠内の数字をいじってプレイヤーをスタート地点に移動させます
②.png

同様にカメラをプレイヤーの後ろに移動させます
3

CharacterControllerを取りつける

プレイヤーを選択して、AddComponentをおします
下の検索欄に「ch」と入力して、CharacterControllerを選択します
4

CharacterControllerを調整する


CharacterControllerには当たり判定の役割もあります
なのでその当たり判定がちょうどプレイヤーの頭、胴体、足を包み込むように調整しましょう
画像のように当たり判定のY座標や半径、高さを調整しましょう
5

プレイヤーを移動させる

では、プログラミングをしていきます
CharacterControllerにはcharacterController.MoveとcharacterController.isGroundedというCharacterController独自のコードがありますので覚えておきましょう

characterController.Move();

①CharacterControllerを移動させる
②()の中にはVector3型の変数を入れる

characterController.isGrounded;

①CharacterControllerが地面についているか判定する
②if(characterController.isGrounded){}のように使う

また、上記のようなコンポーネント独自のコードを扱う場合、

①コンポーネントの機能を代入する変数を作成
②コンポーネントの値を作成した変数に代入
③実際に値を操作

という手順を踏みます
スクリプトの作り方やプレイヤーにつける方法、スクリプトの書き方はこちらの漫画に出てきますので参考にして下さい

今回作成するスクリプトはScratchで表すとこんな感じになります
ws1.png

こちらに対応表がありますので参考にしながら記述していきましょう

以下スクリプトです

Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    private CharacterController characterController;//①CharacterControllerの機能を使うためにcharacterControllerという変数を作成
    private Vector3 Velocity;//CharacterControllerを動かすためのVector3型の変数を作成
    [SerializeField]
    private float JumpPower;
    [SerializeField]
    private float MoveSpeed;//移動スピードを入れるための変数

    // Use this for initialization
    void Start()
    {
        characterController = GetComponent<CharacterController>();//②characterControllerにCharacterControllerを代入する
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))//Wキーがおされたら
        {
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);//前方にMoveSpeed * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.S))
        {
            characterController.Move (this.gameObject.transform.forward * -1 * MoveSpeed * Time.deltaTime);//後方にMoveSpeed * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(new Vector3(0, -5, 0));//左回転する        
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(new Vector3(0, 5, 0));//右回転する        
        }

       characterController.Move (Velocity * Time.deltaTime);//characterControllerを常にVelocity * Time.deltaTime分動かす

        Velocity.y += Physics.gravity.y * Time.deltaTime;//Velocityのy軸をPhysics.gravity.y * 時間の経過分動かす
        if (characterController.isGrounded) {//もしcharacterControllerが地面に着いたら
            if (Input.GetKeyDown (KeyCode.Space)) {//もしSpaceキーがおされたら
                Velocity.y = JumpPower;//Velocity.yをJumpPowerにする
            }
        }
    }
}

入力し終わったらJumpPower、MoveSpeedに数値を入力してみましょう(お好みで調整してほしいですが、オススメは4、10です)
また、カメラをプレイヤーにドラッグ&ドロップします
1-4.png

AnimatorControllerの説明

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

AnimatorControllerの作成

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

続いて、Playerと名前をつけて、プレイヤーにドラッグ&ドロップします
2

AnimatorControllerの設定

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

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

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

ドラッグ&ドロップしたアニメーションを選択し、名前を分かりやすいように変更します
今回は待機アニメーションを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にします

true.png

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

seni.png

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

こちらもCharacterControllerの時と同様に
①コンポーネントの機能を代入する変数を作成
②コンポーネントの値を作成した変数に代入
③実際に値を操作

という手順を踏みます

スクリプトにコメントでそれぞれの該当する部分を書いておきましたので参考にしてください

簡単に説明するとWASDキーで移動している時はRunをtrue、キーが離された時はRunをfalse、
同様に攻撃のボタンであるマウスが左クリックされたらAttackがtrue、離されたらAttackがfalseになるようになっています

Player.cs
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<CharacterController>();
        animator =GetComponent<Animator>();//②コンポーネントの値を作成した変数に代入
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))//Wキーがおされたら
        {
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);//前方にMoveSpeed * 時間経過分動かす
            animator.SetBool("Run", true);//③Runをtrueにする        
        }
        else if (Input.GetKeyUp(KeyCode.W))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }

        if (Input.GetKey(KeyCode.S))
        {
            characterController.Move (this.gameObject.transform.forward * -1 * MoveSpeed * Time.deltaTime);//後方にMoveSpeed * 時間経過分動かす
            animator.SetBool("Run", true);//③Runをtrueにする        
        } 
        else if (Input.GetKeyUp(KeyCode.S))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }

        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(new Vector3(0, -5, 0));//左回転する        
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(new Vector3(0, 5, 0));//右回転する        
        }

       characterController.Move (Velocity * Time.deltaTime);//characterControllerを常にVelocity * Time.deltaTime分動かす

        Velocity.y += Physics.gravity.y * Time.deltaTime;//Velocityのy軸をPhysics.gravity.y * 時間の経過分動かす
        if (characterController.isGrounded) {//もしcharacterControllerが地面に着いたら
            if (Input.GetKeyDown (KeyCode.Space)) {//もしSpaceキーがおされたら
                Velocity.y = JumpPower;//Velocity.yをJumpPowerにする
            }
        }
    }
}

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

VR1.gif

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3