(Unity)動く床とCharaが一緒に動く&動く床の上で、Charaが個別に動ける(CharacterController)

(発想)

「OnTriggerStay」と「CharacterController」の「Move( )」を使って、床と接触時は、床の移動と同じ速度で、Charaを移動させる。

*CharacterControllerを追加したオブジェクトを移動させるには「Move( )」を使う。


(スクリプト)

<動く床>

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

public class MoveFloor : MonoBehaviour
{
    public int num = 1;
    private Vector3 pos;

    void Update()
    {
        transform.Translate(Vector3.forward * num * Time.deltaTime);

        pos = transform.position;

        if(pos.z > 10)
        {
            num = -1;
        }
        else if( pos.z < 5)
        {
            num = 1;
        }
    }
}

<Bot>

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

public class CharaBot : MonoBehaviour
{
    public CharacterController controller;
    public float speed;
    private Vector3 moveDirection = Vector3.zero;
    private float gravity = 9.8f;

    void Update()
    {
        moveDirection.z = Input.GetAxis("Vertical");

        transform.Rotate(0, Input.GetAxis("Horizontal") * 2, 0);

        if (moveDirection.magnitude > 0.1f)
        {
            Vector3 globalDirection = transform.TransformDirection(moveDirection);
            controller.Move(globalDirection * speed * Time.deltaTime);
        }

        moveDirection.y -= gravity * Time.deltaTime;

        if (controller.isGrounded)
        {
            moveDirection.y = 0;
        }
    }

    // 動く床と連動させる。
    private void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Floor"))
        {
            int charaNum = other.GetComponent<MoveFloor>().num;

            // ★移動速度と移動の方向を「床」と一致させる(ポイント)
            controller.Move(Vector3.forward * charaNum * Time.deltaTime);
        }
    }
}

(実行結果)

<床と一緒に移動できる>

<動く床の上で個別に移動できる>