- 投稿日:2020-08-10T23:32:34+09:00
「Lightning - Procedural Lightning」について紹介
この記事は「Unityアセット真夏のアドベントカレンダー 2020」の、11日目の記事になります
昨日はすしさんの「夏なので洞窟を掘って探検したい」でした
明日はJaol-Industryさんの「え!!5分で38言語対応を!? できらあっ!【AutoLocalization】」ですはじめに
今回はライティングエフェクトのアセットの紹介です
Lightning - Procedural Lightning - AAA Quality, Performance and Sound. Dozens of Prefabs. 2D + 3D.Lightning - Procedural Lightning - は色んなライティングエフェクトを実現できるアセットです。カスタマイズは簡単、レンダリングはGPUで完結、性能低いモバイルデバイスをサポートするタイプもいくつがあります
基本的な使い方
コーティングは要らなくて、基本的にStart Point、End Pointとアセット用意してるプレハブを設置すれば、後は設定をカスタマイズするだけです
Lightning - Procedural Lightning - は色んなライティングエフェクトを実現できるですが、ここは個人よく使ってる「LightningBoltPrefabHDR」で紹介させていただきます
◾️ LightningBoltPrefabHDR:
◾️ LightningBoltPrefabHDRの中身:
Start Point、End Poinの2つObjectだけ、シンプルです
◾️ Play:
Start Point、End PoinのPostion調整して、
UnityをPlayするとデフォルトのライティングが現れます
引き継ぎ、ライティングの色、マテリアルと次のライティングの待機時間を好きに調整します
◾️ 色、マテリアル
◾️ サイズなどカスタマイズ
ここでは待機時間とライティングの色だけ編集しました
自作ゲームの話になりますが、嵐や天気大荒れなどの背景ではよくこの感じで使います
操作シンプル、しかも速い!
終わりに
同じ作者も無料のライティングアセットがあります
Lightning Bolt Effect for UnityLightning - Procedural Lightning - AAA Quality, Performance and Sound. Dozens of Prefabs. 2D + 3D.は少し高めなアセットですが、個人的に「色んなライティングエフェクトがあり」、「コーティングは要らなくて、使い方法とカスタマイズは簡単」この2点に魅了されてこのアセットを購入しました
「Unityアセット真夏のアドベントカレンダー 2020」の、11日目の記事は以上になります
- 投稿日:2020-08-10T21:19:27+09:00
見栄えがいいなと思った無料のUnityアセット三点のご紹介
今回使った Unity Asset で、最初から知っていたら良かったのになと思った、見栄えの良くなる無料アセットを紹介します。この gif だと、背景、ボタン、コイン、パーティクル、にあたります。
もし他にも見栄えがよくなるアセットがあったらぜひ教えてください。
LowPoly Environment Pack
今回の背景のほとんどはこれです。山、木、草など色々含まれているので、もっと丁寧に作り込むことも可能です。適度な優しい雰囲気のアセットで使い勝手が良かったです。
POLYGON - Starter Pack
今回の空、コイン、手で触っているボールなどは、細いものが結構これです。ローポリのオブジェクトをたくさん作っている会社さんの一つです。これだけ無料で、有料だと各テーマに沿って出来上がった感じになっていて、それはそれでレゴみたいな雰囲気感があります。まずはこの無料版を使ってみて、良かったら有料版を必要に応じて購入すると、みんなハッピーになれる気がします。
Cartoon FX Free(パーティクル)
今回の
- ニワトリの出現じの怪しい煙
- ニワトリが飛んでいくときのタツマキ
- 風船が割れるときの爆発
など、全部これで賄っています。
他にも炎や砕けるパーティクルなど、使えそうなのがあって、便利だなと思いました。このアセットのデモを実行すると、50種類あるパーティクルを順次実行していけるので、確認して使えそうなのを入れると良いかと思います。
そして今回のゲームは Oculus Quest で実行しているので、もちろん VR で使えますし、パフォーマンス的にも問題ないです。
- 投稿日:2020-08-10T09:53:18+09:00
UnityでFPSゲームの入力をハンドリングする
FPS、TPSゲームの視点操作や移動をunityでどう実現しているのかを知りたかったので、tutorialのコードを読んで勉強した。
FPS Microgame /| Templates | Unity Asset Store
versionは
1.1.2
unityのバージョンは2019.4.7f1
入力の受け取り部分は、
Scripts/PlayerInputHandler.cs
が担っている。Start()
private void Start() { m_PlayerCharacterController = GetComponent<PlayerCharacterController>(); DebugUtility.HandleErrorIfNullGetComponent<PlayerCharacterController, PlayerInputHandler>(m_PlayerCharacterController, this, gameObject); m_GameFlowManager = FindObjectOfType<GameFlowManager>(); DebugUtility.HandleErrorIfNullFindObject<GameFlowManager, PlayerInputHandler>(m_GameFlowManager, this); Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; }ここで
m_PlayerCharacterController
が主人公を操作するcontrollerである。
m_GameFlowManager
はゲーム全体を管理するcontroller。GetMoveInput()
これはキャラクターの移動に関する関数である。
public Vector3 GetMoveInput() { if (CanProcessInput()) { Vector3 move = new Vector3(Input.GetAxisRaw(GameConstants.k_AxisNameHorizontal), 0f, Input.GetAxisRaw(GameConstants.k_AxisNameVertical)); // constrain move input to a maximum magnitude of 1, otherwise diagonal movement might exceed the max move speed defined move = Vector3.ClampMagnitude(move, 1); return move; } return Vector3.zero; }順番に見ていく。
CanProcessInput()
このゲームでは
esc
を押すことでマウスのロックを解除できる。
ロックを解除している場合は、キャラクターの操作(移動、方向転換)はできない。中のソースコードを確認すると、
public bool CanProcessInput() { return Cursor.lockState == CursorLockMode.Locked && !m_GameFlowManager.gameIsEnding; }つまり、カーソルがロックされているかつ、ゲームがエンディングになっていない場合に入力が可能になる。
Input.GetAxisRaw(string axisName)
Input-GetAxisRaw - Unity スクリプトリファレンス
axisName で識別される仮想軸の平滑化フィルターが適用されていない値を返します
The value will be in the range -1...1 for keyboard and joystick input. Since input is not smoothed, keyboard input will always be either -1, 0 or 1. This is useful if you want to do all smoothing of keyboard input processing yourself.これだけではよくわからないが、ゲームパッドの入力や、キーボード、マウスの入力を軸ごとに[-1, 1]の範囲で正規化して返してくれる。
つまり、複数の入力デバイスに対して正規化された数値で方向を返してくれる便利な関数。ちなみに
Input.GetAxisRaw
はキーボードの入力に対しては-1
,1
のどちらかを返すが、Input.GetAxis
は平滑化された値が返る。
リアルな挙動を再現したい場合は、Input.GetAxis
の方が適している?
ref: http://albatrus.com/main/unity/7209Vector3.ClampMagnitude(Vector3 vector, float maxLength)
vector
の大きさがmaxLength
でclampされるようにする関数である。GetMoveInput()
はじめに戻って、
GetMoveInput()
について。
これはつまり、入力が可能であれば、入力された値の大きさが1以内に収まるように方向ベクトルを返し、そうでなければ0ベクトルを返す関数
であることがわかる。
GetLookInputsHorizontal() / GetLookInputsVertical()
視点の回転に関する関数である。
軸が異なるだけなので、Horizontalのみ見ていく。
public float GetLookInputsHorizontal() { return GetMouseOrStickLookAxis(GameConstants.k_MouseAxisNameHorizontal, GameConstants.k_AxisNameJoystickLookHorizontal); }
GetMouseOrStickLookAxis
を呼んでいるだけであることがわかる。GetMouseOrStickLookAxis(string mouseInputName, string stickInputName)
float GetMouseOrStickLookAxis(string mouseInputName, string stickInputName) { if (CanProcessInput()) { // Check if this look input is coming from the mouse bool isGamepad = Input.GetAxis(stickInputName) != 0f; float i = isGamepad ? Input.GetAxis(stickInputName) : Input.GetAxisRaw(mouseInputName); // handle inverting vertical input if (invertYAxis) i *= -1f; // apply sensitivity multiplier i *= lookSensitivity; if (isGamepad) { // since mouse input is already deltaTime-dependant, only scale input with frame time if it's coming from sticks i *= Time.deltaTime; } else { // reduce mouse input amount to be equivalent to stick movement i *= 0.01f; #if UNITY_WEBGL // Mouse tends to be even more sensitive in WebGL due to mouse acceleration, so reduce it even more i *= webglLookSensitivityMultiplier; #endif } return i; } return 0f; }少し複雑だが、順を追ってみていく。
// Check if this look input is coming from the mouse bool isGamepad = Input.GetAxis(stickInputName) != 0f; float i = isGamepad ? Input.GetAxis(stickInputName) : Input.GetAxisRaw(mouseInputName);ここでは、gamepadの入力を使うか、mouseの入力を使うかを決定している。
Input.GetAxis()
,Input.GetAxisRaw()
の説明はInput.GetAxisRaw()を参照
gamepadの入力があればその入力を使い、そうでなければmouseの入力を使用する。mouseは
Input.GetAxisRaw
を使っているが、gamepadはInput.GetAxis
を使っているのは興味深い。UXの問題?// handle inverting vertical input if (invertYAxis) i *= -1f;invertAxisはエディタから定義できる定数。
y軸を反転させたいときは、invertYAxis = true
にすれば反転できる…が、X軸とY軸の判定をこの関数ではしていないので、invertYAxis = true
にするとx軸の操作も逆になる(v1.1.2
)次に感度の設定
// apply sensitivity multiplier i *= lookSensitivity;その後にgamepadとmouseのscaleを揃えている
if (isGamepad) { // since mouse input is already deltaTime-dependant, only scale input with frame time if it's coming from sticks i *= Time.deltaTime; } else { // reduce mouse input amount to be equivalent to stick movement i *= 0.01f; #if UNITY_WEBGL // Mouse tends to be even more sensitive in WebGL due to mouse acceleration, so reduce it even more i *= webglLookSensitivityMultiplier; #endif }mouseがフレーム単位の移動量なので、gamepadもそれに揃えるために
Time.deltaTime
をかけている(?)。ここの辺りはよくわからなかったが、とりあえずscaleを揃えているだけという認識で良さそう。