はかせのラボ

プログラミングを主とした雑記ブログです

UE4 この暗黒の世界の闇をはらうためにはフォグが必要だ

あいさつ

どうも、はかせです。

昨日はUnityのタスクを進めたので
今日はUE4のタスクを進めたいと思いました。

ただUE4の中身のコードはちょくちょく読むんですが、
UE4そのものを使った経験は限りなく無です。
(一応いつぞやセミナー的なものに参加したことはある)

そんな限りなく初心者、
いや下手したら初心者以下の私が
踏んだ地雷的なものの話です。

この世界は暗黒の中

とりあえずUE4には「マップ」っていうものがあるみたいです。

Unityとかだとシーンに該当するもの・・・だと思います。

とりあえずUE4の操作に慣れるために
適当なテストマップ作ってみてーって言われたので
マップを作ってライトとか色々置いてみました。

結果がこちらです。
f:id:hakase0274:20191023180624p:plain

暗黒・・・

どんなカメラを置こうと、
f:id:hakase0274:20191023181148p:plain
どんなライトを置こうと、
f:id:hakase0274:20191023181200p:plain
どんなオブジェクトを置こうと、
f:id:hakase0274:20191023181225p:plain

この世界に光がもたらされることはありませんでした。
(光が無いはずの世界で何故オブジェクトの色が認識できるんだ・・・?)

光をもたらす方法をググっても

UE4 真っ暗」
とか
UE4 光無い」
とかでググっても特別この症状を解決する方法は見当たりませんでした。
(みんなメッシュがどうの光の当たり方がどうのとレベルの高いお話をしていました)

あぁ・・私のUE4の世界は光亡き世界のようです・・・・・

勇者が魔王の誘いにでものってしまったのですかね・・・・

世界はフォグ欲していた

私が闇の前に屈しこんなツイートをしたところですね

かの有名なMSMVP
(MeshiterroriSt Most Valuable Professional)
のろっさむ神からですね
このような啓示を授けていただきました。

ビジュアルエフェクト・・・?
フォグ・・・?
一体どんな飯テロなんだ・・・?


(これはきっと違う)

とりあえず検索窓に「フォグ」って打ち込んで
f:id:hakase0274:20191023183150p:plain
この「大気フォグ」ってのを置いてみますか。

f:id:hakase0274:20191023183259p:plain

世界に光が・・・!

ろっさむ神アリガタヤアリガタヤ

あとがき

今回はUE4を包んでいた闇をフォグを使ってはらった話でした。

何故フォグが必要なのか?
そもそもフォグとはなんなのか?
わからないことだらけですが
ようやく世界に光が生まれてホっと一息です。

Unityはシーン作るだけで光がある平和な世界だったのに
UE4はいきなり闇の中に放り込まれて
ライオンが子供を崖に突き落とす話を思い出しました。

正直エンジンならもう少し新設設計でも
いいんじゃないかなと思いました。
(色んな意味で怖かった)

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ

Unity FPSゲームやバイオで見るようなカメラとラジコン操作

あいさつ

どうも、はかせです。

今日は趣味のDirectX12ではなく
誘われたプロジェクトの作業してました。

今回はその中で実装してみた
簡単にできるFPSとかバイオで見る感じのラジコン操作を
紹介します。

どういうやつ

こんなやつ
www.youtube.com

マウスグリグリで視点移動ができて
十字キーorWASDで操作キャラ視点での
上下左右に移動できる感じです。

カメラ移動

今回はFPSカメラということでマウスの動きに応じて
カメラを回転させます。

using UnityEngine;

public class MouseCamera : MonoBehaviour
{
    public Transform YAxis;
    public Transform XAxis;

    public float XSpeed = 1.0f;
    public float YSpeed = 1.0f;

    private void Start()
    {
        //マウスカーソル消したければこのコメントアウトを外す
        //Cursor.lockState = CursorLockMode.Locked;
        //Cursor.visible = false;
    }

    // Update is called once per frame
    void Update()
    {
        float xRotation= Input.GetAxis("Mouse X") * XSpeed;
        float yRotation= Input.GetAxis("Mouse Y") * YSpeed;
        YAxis.transform.Rotate(0, -xRotation, 0);
        XAxis.transform.Rotate(yRotation, 0, 0);
    }
}

Input.GetAxisでマウスの移動量が取得できるので
そこに速度を掛け合わせて各軸での回転を計算します。

あとは計算した値を使ってtransform.Rotate関数で
回転させるだけですね。

X軸Y軸をそれぞれ別のTransformにしている理由は
同じTransformでX軸Y軸を回転させるとZ軸までズレてしまうからです。

これは3次元回転の性質上仕方のないことみたいです。

なのでそれぞれ別のTransformを回転させて
このズレが起きないよう誤魔化しています。

ラジコン操作

操作するキャラの視点で操作する方法ですね。
バイオなんかの動きがイメージしやすいと思います。

using UnityEngine;

public class Move : MonoBehaviour
{
    public float XSpeed = 1.0f;
    public float YSpeed = 1.0f;

    // Update is called once per frame
    void Update()
    {
        var pos = transform.position;
        pos += transform.right * Input.GetAxis("Horizontal") * XSpeed;
        pos += transform.forward * Input.GetAxis("Vertical") * YSpeed;
        transform.position = pos;
    }
}

ラジコン操作は操作するキャラクターの視点での操作になります。
なので移動量を計算しその移動量を
キャラクターから見たベクトルに変換してやる必要があります。

キャラクターの前はtransform.forward
キャラクターの右はtransform.right
それぞれ正規化されたベクトルを得られます。

あとはそのベクトルに計算した移動量をかけてやれば
その方向にそれだけ移動するベクトルができます。

最後に計算した前移動のベクトルと左右移動のベクトルを
原点に足してやればラジコン移動の完成です。

あとがき

今回はFPSゲームやバイオで見るようなカメラとラジコン操作を
Unityの機能を使ってなるべく簡単に実装してみました。

一応それっぽい動きとかはUnityの
Standard Assetsにあるっちゃあるんですが、
のべたに使うとZ軸ズレとか起こるんで
あくまで参考程度にするのがいいと個人的には思っています。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ