コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【Unity】動く床や回転する足場と連動できるキャラクターコントローラー「Easy Character Movement」紹介

f:id:baba_s:20171007202816p:plain

概要

2016/4/11 に「Easy Character Movement」がリリースされました

「Easy Character Movement」を導入すると、
Rigidbody をベースとしたキャラクターコントローラーを使用できるようになり、
動く床や回転する足場と連動する処理を簡単に実装できます

検証環境

  • Unity 2017.1.1f1
  • Easy Character Movement 1.4

クイックスタート

f:id:baba_s:20171007203100p:plain

Hierarchy を右クリックして「ECM>Character」を選択します

f:id:baba_s:20171007203512p:plain

Project ビューで「Easy Character Movement/Prefabs/Models」フォルダの
ECM_CapsuleDummy」プレハブを、Hierarchy の「ECM_Character」にドラッグします

f:id:baba_s:20171007203730p:plain

Hierarchy を右クリックして「3D Object>Plane」を選択します

f:id:baba_s:20171007203903p:plain

「Plane」の Position を 0, 0, 0 にします

f:id:baba_s:20171007204003p:plain

「Main Camera」の Position を 0, 5, -10
Rotation を 30, 0, 0 にします

f:id:baba_s:20171007204246g:plain

この状態でゲームを再生して矢印キーやスペースキーを押すと
キャラクターが正常に動作することが確認できます

動く床と連動させる

using UnityEngine;

[RequireComponent( typeof( Rigidbody ) )]
public class MoveFloor : MonoBehaviour
{
    public float     m_length    = 2;
    public Rigidbody m_rigidbody = null;

    private void Reset()
    {
        m_rigidbody = GetComponent<Rigidbody>();
        m_rigidbody.isKinematic = true;
    }

    private void Update()
    {
        var basePos  = transform.position;
        var y        = Mathf.PingPong( Time.time, m_length );
        var position = new Vector3( basePos.x, y, basePos.z );

        m_rigidbody.MovePosition( position );
    }
}

適当に Cube オブジェクトを作成して
上記のスクリプトをアタッチしてゲームを実行すると
キャラクターが動く床に乗って移動できることが確認できます

f:id:baba_s:20171007205703g:plain

回転する足場と連動させる

using ECM.Examples.Common;
using UnityEngine;

[RequireComponent( typeof( Rigidbody ) )]
public class RotateFloor : MonoBehaviour
{
    public float     m_rotateSpeed = 50;
    public Rigidbody m_rigidbody   = null;

    private float m_angle;
    
    private void Reset()
    {
        m_rigidbody = GetComponent<Rigidbody>();
        m_rigidbody.isKinematic = true;
    }

    private void Update()
    {
        m_angle += m_rotateSpeed * Time.deltaTime;
        m_angle = Utils.WrapAngle( m_angle );

        var rotation = Quaternion.Euler( 0, m_angle, 0 );
        m_rigidbody.MoveRotation( rotation );
    }
}

適当に Cube オブジェクトを作成して
上記のスクリプトをアタッチしてゲームを実行すると
キャラクターが回転する足場に乗って移動できることが確認できます

f:id:baba_s:20171007210324g:plain