Light Shaft
God Rays
Volumetric Spotlight
などと呼ばれているスポットライトの演出を取り入れると面白そう
UnityのプロジェクトがHDRPならVolumetric SpotLishtが使用できる
設定の例をこちらに示す
この時間はRoll a Ballの改造の他の自作ゲームやSnap!のゲームの制作時間にしてもよい
光源にアニメーションを設定
シーンの照明 Directional Light を選択して Animation Window から アニメーションを Create する
アニメーションクリップのファイルに適当に名前を付けて保存する
Animation Windowの Add Property から
Transform → Rotation
Light → Color
の2つを追加する
60フレームにあるキーを選択する
総フレーム数を300程度(5秒間)に増やす
操作方法: Dopesheetの最終フレームを300フレームまでドラッグ
赤 Previewが有効でアニメーションを再生するとScene Windowでアニメーションを確認できる。その際 Animatorは一時的に無効になる。
緑 タイムライン上の再生ヘッド(縦線)のフレーム数が表示されている
黄 キーフレームを選択中。再生ヘッド(縦線)のフレームとは異なることに注意。
橙 再生ヘッド(縦線)の位置のプロパティの値が表示されている。
数値を入力(変更)すると再生ヘッド(縦線)のフレームにキーが挿入される。
※再生ヘッド(縦線)の位置にキーは挿入される※
Animation Window で回転アニメーションを設定
回転量の設定
Dopesheetで Rotation.yを選択
再生ヘッド(縦線)を300フレームに進める。 ※300フレーム目のキーを選択するのではない
初期値+720
に設定(2回転。逆回転はマイナス値を指定) ※初期値は0フレームの値
Curvesタブに切り替える
PropertyのRotation.yを選択
キーボードで a を押してカーブ全体を表示する
アニメーションの開始と終了の加減速の解除
Curvesで 開始キーフレームを右クリック → Right Tangent (傾き)→ Linear(線形)
Curvesで 終了キーフレームを右クリック → Left Tangent (傾き)→ Linear(線形)
あるいは
Curvesで 開始と終了キーフレームをShift+左クリックで同時選択 → 右クリック → BothTangent (傾き)→ Linear(線形)
光源の色変化のアニメーションを設定
時短のため方法2で実演する
方法1:
下の画像のように中間フレームを複数作成して R G B の値がうまくカーブして交代できるようにする。
InspectorからLightコンポーネントを選択
ColorプロパティをHSVモードに変更
適当に色を変更
例
H 0
S 100
V 100
Animation Winow -> keyframe recording mode キーフレーム記録モードを ON
frame 100 に再生ヘッド(縦線)を進めて Inspectorで色変更 (またはAnimation WindowのRGB値を変更)→ キーが自動挿入される
frame 200 に再生ヘッド(縦線)を進めて Inspectorで色変更 (またはAnimation WindowのRGB値を変更)→ キーが自動挿入される
Animation Winow -> keyframe recording mode 記録モードを OFF
方法2:
照明の明るさを 暗 → 明 と変化させるアニメーションを設定する
AnimationのPropertyに Light Intensity を追加
Animation Windowで初期値を設定
frame 0
Light Intensity 0
アニメーションクリップはデフォルトでループ再生される。ループせずに再生回数を1回にするには、
Project(Assetsの)アニメーションクリップを開く(ダブルクリック)
Inspectorから
Loop Time を OFF
にする
スクリプトでHSVからRGBに変換する方法。
参照:
【Unity】スクリプトでRGBとHSVを相互に変換する方法
独自にShaderを用意する方法。
参照:
可動関節(回転ジョイント)を持つゲームオブジェクトを作成する。
シーンに円筒(シリンダー Cylinder)を追加
Hierarchy 3D Object Cylinder
Position Scale を調整
CylinderにHinge Joint(ヒンジ・ジョイント)コンポーネントを追加
Add Component -> Physics -> Hinge Joint
プロパティを調整
Anchor 支点の位置 Y= 1 上端 / Y= 0 中央 / Y= -1 下端
Axis 回転軸
Use Motor モーターで回転
Target Velocity 目標速度
Force 回転力
motor OFF 自力回転無し
motor ON 自力回転
Cubeを追加
CubeにFixed Joint(固定ジョイント)コンポーネントを追加
Add Component -> Physics -> Fixed Joint
プロパティを調整
Connected Body 接続対象 を Cylinder に選択して設定
Mass Scale このジョイントを持つ側の質量の影響を調整する。この値を乗じた質量として扱う。
Connected Mass Scale 接続対象側の質量の影響を調整する。この値を乗じた質量として扱う。
Hinge Jointとオブジェクトの親子関係
親のオブジェクトのHinge Jointによる姿勢変化は子のオブジェクトに影響する
逆方向の
子のオブジェクトに働く力(物理)は親に影響する
GP11で紹介した「WaveAnimスクリプト」とEXのサブページの「衝突スイッチ」を組み合わせる。
隠し階段の制作
Playerが接触すると再生を開始するアニメーションオブジェクトを8個作成して振幅(最大移動量)を調整する。
CollisionAnim.csを作成
下記コード参照
Cubeを追加
Position 調整
Rigidbodyコンポーネントを追加
Is Kinematic ON
CollisionAnim.csをアタッチ
Cubeを合計8個にコピー
CollisionAnimスクリプトコンポーネントのプロパティを調整
A 振幅 Y 0, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75 を順に各Cubeに設定※1
A 振幅 Z 0, 1, 2, 3, 4, 5, 6, 7 を順に各Cubeに設定※2
F 周波数(速度倍率) Y と Z を 0.1
1で1秒で一周する。0.1は10秒で一周する。
Loop 無限ループ OFF
Duration ループがOFFの時の再生時間 2.5
Fが0.1で10秒で1周する。Durationが2.5なので1/4周。
時計の針が0時スタートで3時の位置まで進むのと同様。3時で針の先は一番右に位置する(もっとも遠ざかる)
CollisionAnim.csスクリプト
CollisionAnim1.csスクリプト
LoopがOFFの場合で、アニメーション開始後にDuration時間の経過後にResetableがONになっているとオブジェクトの再衝突でアニメションが再起動するように修正した例を示す。
ここでC#のVector3の演算機能の拡張を考える。
Vector3 a,b に対して
a.Apply( 1変数関数f ) で ( f(a.x), f(a.y), f(a.z) ) を計算
a.Apply( 2変数関数g , b) で (g(a.x, b.x), g(a.y, b.y), g(a.z, b.z)) を計算
する拡張メソッドを定義すると、offsetの値を以下の式で計算できる。
Vector3 offset = a.Apply((a, b) => a * b , ((f * 360 * time + new Vector3(px, py, pz)) * Mathf.Deg2Rad).Apply(Mathf.Sin));
public static class Vector3Extensions
{
// Vector3の各要素に関数を適用する拡張メソッド
public static Vector3 Apply(this Vector3 vector, Func<float, float> func)
{
return new Vector3(func(vector.x), func(vector.y), func(vector.z));
}
// 二つのベクトルを受け取り、Func<float, float, float>を適用する拡張メソッド
public static Vector3 Apply(this Vector3 vector, Func<float, float, float> func, Vector3 other)
{
return new Vector3(func(vector.x, other.x), func(vector.y, other.y), func(vector.z, other.z));
}
}