猫が駆け抜けるだけだとまだ普通すぎるので、さらに 3D のボールを追加してけとばせてみたいと思います
まずは Unity Asset Store で適当な 3D モデルを物色してダウンロードとインポート
WoodenBall がいい感じなのでこれだけチェックしてインポートします
インポートが終わったら WoodenBall のプレハブを Hierarchy 上にドラッグドロップして Inspecter ビューで数値調整後、「Ball」という Tag を追加して設定しました
猫がぶつかったらころころと転がるように Physics の中の RigidBody と Sphere Collider を Add Component ボタンから追加します
Sphere Collider は球状の衝突判定をするためのもので、RigidBody は物体の物理特性を付与します
RigidBody の主なパラメータの意味
Mass : 重さ(kg)
Drag : 移動時の空気抵抗、大きいほど速度が減衰しやすい
Angular Drag : 回転運動への空気抵抗、大きいほど回転が止まりやすい
Use Gravity : 重力の影響を与える場合チェック
Is Kinematic : 物理演算による移動を無効化する場合チェック
軽くて止まりやすいボールに調整してみました
猫の方も Character Controller の数値を調整して、Player.cs というスクリプトを追加しました
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 を持ち物理移動が可能だった場合のみ、衝突方向への運動エネルギーを衝突相手に与えて動かします
コロコロと玉ころがし、なかなか楽しいですね