20200810のUnityに関する記事は3件です。

「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:

スクリーンショット 2020-08-08 16.01.03.png

◾️ LightningBoltPrefabHDRの中身:

Start Point、End Poinの2つObjectだけ、シンプルです
スクリーンショット 2020-08-08 16.05.57.png

◾️ Play:

Start Point、End PoinのPostion調整して、
UnityをPlayするとデフォルトのライティングが現れます
Aug-08-2020 16-30-51.gif

引き継ぎ、ライティングの色、マテリアルと次のライティングの待機時間を好きに調整します

◾️ 色、マテリアル

スクリーンショット 2020-08-08 16.31.55.png

◾️ サイズなどカスタマイズ

スクリーンショット 2020-08-08 16.32.04.png

ここでは待機時間とライティングの色だけ編集しました
自作ゲームの話になりますが、嵐や天気大荒れなどの背景ではよくこの感じで使います
操作シンプル、しかも速い!
Aug-08-2020 16-44-42.gif

終わりに

同じ作者も無料のライティングアセットがあります
Lightning Bolt Effect for Unity

Lightning - Procedural Lightning - AAA Quality, Performance and Sound. Dozens of Prefabs. 2D + 3D.は少し高めなアセットですが、個人的に「色んなライティングエフェクトがあり」、「コーティングは要らなくて、使い方法とカスタマイズは簡単」この2点に魅了されてこのアセットを購入しました

Unityアセット真夏のアドベントカレンダー 2020」の、11日目の記事は以上になります

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

見栄えがいいなと思った無料のUnityアセット三点のご紹介

小一の子供向けの漢字を学ぶゲームを作ってみました。
kanji.gif

今回使った Unity Asset で、最初から知っていたら良かったのになと思った、見栄えの良くなる無料アセットを紹介します。この gif だと、背景、ボタン、コイン、パーティクル、にあたります。

もし他にも見栄えがよくなるアセットがあったらぜひ教えてください。

LowPoly Environment Pack

スクリーンショット 2020-08-10 21.05.59.png

今回の背景のほとんどはこれです。山、木、草など色々含まれているので、もっと丁寧に作り込むことも可能です。適度な優しい雰囲気のアセットで使い勝手が良かったです。

POLYGON - Starter Pack

スクリーンショット 2020-08-10 21.06.26.png

今回の空、コイン、手で触っているボールなどは、細いものが結構これです。ローポリのオブジェクトをたくさん作っている会社さんの一つです。これだけ無料で、有料だと各テーマに沿って出来上がった感じになっていて、それはそれでレゴみたいな雰囲気感があります。まずはこの無料版を使ってみて、良かったら有料版を必要に応じて購入すると、みんなハッピーになれる気がします。

Cartoon FX Free(パーティクル)

cartoonfxfree.gif

今回の

  • ニワトリの出現じの怪しい煙
  • ニワトリが飛んでいくときのタツマキ
  • 風船が割れるときの爆発

など、全部これで賄っています。

他にも炎や砕けるパーティクルなど、使えそうなのがあって、便利だなと思いました。このアセットのデモを実行すると、50種類あるパーティクルを順次実行していけるので、確認して使えそうなのを入れると良いかと思います。

そして今回のゲームは Oculus Quest で実行しているので、もちろん VR で使えますし、パフォーマンス的にも問題ないです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/7209

Vector3.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を揃えているだけという認識で良さそう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む