読者です 読者をやめる 読者になる 読者になる

しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で 3D 猫にボールをけらせてみる

猫が駆け抜けるだけだとまだ普通すぎるので、さらに 3D のボールを追加してけとばせてみたいと思います

まずは Unity Asset Store で適当な 3D モデルを物色してダウンロードとインポート

f:id:matatabi_ux:20151227171316p:plain

WoodenBall がいい感じなのでこれだけチェックしてインポートします

f:id:matatabi_ux:20151227171402p:plain

インポートが終わったら WoodenBall のプレハブを Hierarchy 上にドラッグドロップして Inspecter ビューで数値調整後、「Ball」という Tag を追加して設定しました

f:id:matatabi_ux:20151227171702p:plain

猫がぶつかったらころころと転がるように Physics の中の RigidBody と Sphere Collider を Add Component ボタンから追加します

Sphere Collider は球状の衝突判定をするためのもので、RigidBody は物体の物理特性を付与します

RigidBody の主なパラメータの意味

  • Mass : 重さ(kg)

  • Drag : 移動時の空気抵抗、大きいほど速度が減衰しやすい

  • Angular Drag : 回転運動への空気抵抗、大きいほど回転が止まりやすい

  • Use Gravity : 重力の影響を与える場合チェック

  • Is Kinematic : 物理演算による移動を無効化する場合チェック

軽くて止まりやすいボールに調整してみました

猫の方も Character Controller の数値を調整して、Player.cs というスクリプトを追加しました

f:id:matatabi_ux:20151227172710p:plain

Character Controller の Slope Limit(乗り上げられる勾配の最高角度)、Step Offset(乗り上げられる勾配の最高高さ)をともに 0 に設定し、ボールに乗り上がることがないようにしました

あとはあたり判定をまじめに微調整しています

追加した Player.cs はこんな感じ

using UnityEngine;
using System.Collections;

/// <summary>
/// プレイヤークラス
/// </summary>
public class Player : MonoBehaviour
{
    /// <summary>
    /// Use this for initialization
    /// </summary>
    public void Start()
    {
    }

    /// <summary>
    /// Update is called once per frame
    /// </summary>
    public void Update()
    {
    }

    /// <summary>
    /// 衝突時の処理
    /// </summary>
    /// <param name="hit">衝突情報</param>
    public void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if (!"Ball".Equals(hit.gameObject.tag))
        {
            return;
        }

        var body = hit.collider.attachedRigidbody;
        if (body == null || body.isKinematic)
        {
            return;
        }

        body.AddForce(hit.moveDirection);
    }
}

OnControllerColliderHit のイベントハンドラは Character Controller を持つ GameObject が何かと物理衝突した場合に呼ばれます

衝突の相手の Tag が「Ball」で、RigidBody を持ち物理移動が可能だった場合のみ、衝突方向への運動エネルギーを衝突相手に与えて動かします

f:id:matatabi_ux:20151227175148g:plain

コロコロと玉ころがし、なかなか楽しいですね