【Unity】CharactorControllerで衝突判定

void OnControllerColliderHit(ControllerColliderHit hit)を使って、相手に力を加えることができます

using UnityEngine;

public class PushObject : MonoBehaviour
{
    CharacterController controller;
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }
    public float pushPower = 2.0F;

    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        Rigidbody body = hit.collider.attachedRigidbody;

        // リジッドボディなし
        if (body == null || body.isKinematic)
            return;

        // 下のオブジェクトを押さないようにしたい
        if (hit.moveDirection.y < -0.3f)
            return;

        // 移動方向から押す方向を計算する。
        // オブジェクトを上下に押すのではなく、横にだけ押します。
        Vector3 pushDir = new(hit.moveDirection.x, 0, hit.moveDirection.z);

        // キャラクターが移動しようとする速度がわかっている場合。
        // 押し出し速度にそれを乗じることができます。

        // プッシュを適用する
        body.velocity = pushDir * pushPower;
    }
    void Update()
    {

        /*
        if (controller.collisionFlags == CollisionFlags.None)
        {
            print("Free floating!");
        }

        if ((controller.collisionFlags & CollisionFlags.Sides) != 0)
        {
            print("Touching sides!");
        }

        if (controller.collisionFlags == CollisionFlags.Sides)
        {
            print("Only touching sides, nothing else!");
        }

        if ((controller.collisionFlags & CollisionFlags.Above) != 0)
        {
            print("Touching Ceiling!");
        }

        if (controller.collisionFlags == CollisionFlags.Above)
        {
            print("Only touching Ceiling, nothing else!");
        }

        if ((controller.collisionFlags & CollisionFlags.Below) != 0)
        {
            print("Touching ground!");
        }

        if (controller.collisionFlags == CollisionFlags.Below)
        {
            print("Only touching ground, nothing else!");
        }
        */
    }
}

Unity

Posted by hidepon