今回はUnityのゲームで太陽を回転させて1日の時間経過を表現してみます。
ゲームを開始した時のパソコンの時間に応じて太陽の位置を動かし、夕方にゲームをした場合は太陽が沈む前にしたり、夜にゲームをしたら太陽が沈んだ状態から始め、
後はゲーム内の時間軸によって太陽の位置を変えていくとゲーム内の時間経過も表現できそうですね。
今回の機能を作成すると
↑のような感じで太陽が昇り沈むという事が繰り返されます。
↑の例では時間の進みを早くしています。
ひとつだけ注意が必要なのがリアルタイムに影を描写している場合は常に太陽の位置が変わるのでその分処理負荷が高くなるという事でしょうか・・・・(^_^;)
太陽の位置を変更させるには?
太陽の位置を変更させるには元々ヒエラルキー上に置いてあるDirectional Lightの位置を変更すれば良さそうです。
Directional Lightは太陽のように光を表現する時に使用されます。
このDirectinal Lightの位置を変更しますが、実はこのライトは位置は関係なく角度のみが光に影響するようなので、位置ではなく角度を変更していきます。
Directional LightのX軸とY軸の角度を設定し、X軸で回転させて1回転させるようにします。
Directional Lightに新しくRotatingTheSunスクリプトを作り取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class RotatingTheSun : MonoBehaviour { // 1秒間の回転角度 [SerializeField] private float rotateSpeed = 0.1f; // 0時の角度 [SerializeField] private Vector3 rot = new Vector3 (270f, 330f, 0f); void Start() { transform.localRotation = Quaternion.Euler (rot); // 現在のパソコンの時刻で太陽を傾ける var rotX = transform.localEulerAngles.x - 15f * DateTime.Now.Hour; // マイナスの値だったら360を足して0~360の間に補正 if(rotX < 0) { rotX += 360f; } // パソコンの時刻に合わせて太陽の角度を設定 transform.localEulerAngles = new Vector3(rotX, transform.localEulerAngles.y, transform.localEulerAngles.z); } // Update is called once per frame void Update () { // 徐々に回転させる、X軸を反対方向に回転 transform.Rotate (-Vector3.right * rotateSpeed * Time.deltaTime); } } |
rotateSpeedは1秒間に回転する角度を設定します。
rotは太陽の深夜0時の時太陽の角度で今回はDirectional Lightが真上の方向を向くようにします。
Y軸の角度を変更し太陽が昇る角度を変更します。
StartメソッドではDirectional Lightの初期角度をrotの角度にし、さらにパソコンの時刻(DateTime.Now.Hour)に15(360割る24時間)をかけることで0時から経過した角度にします。
元のX軸の角度から引いているのは太陽の昇る方向に合わせている為です。
太陽を昇らせる角度によっては足す可能性もあります。
角度は0~360の間にしなければいけないので、0より小さい角度が設定された場合は360を足しています。
UpdateメソッドではX軸(Vector3.right)の反対方向に1秒間に回転する角度分を回転させます。
ゲーム内の1時間で太陽を1回転させるには
rotateSpeedが360で1秒間で1回転(1日)なので
1秒→1 * 60 * 60で1時間にするので、回転角度はその分減らして360 / (60 * 60)で0.1となります。
ゲーム内の1時間で1日を表現するにはrotateSpeedを0.1にします。
Directional LightのインスペクタではFlareにSunを設定し太陽の反射光を表現します。
RotatingTheSunの設定は↑のようになります。
これで機能が完成しました。
記事の最初のサンプル動画はrotateSpeedを10にしたので結構早く時間が経過します。
終わりに
Directinal Lightの角度を回転させて一日を表現する事が出来ましたが、夜では真っ暗すぎてわからないのである程度見える範囲で角度を飛ばした方がいいのかもしれません・・・・(^_^;)