20190827のUnityに関する記事は16件です。

UnityでAndroidのKeystoreを自動でセーブ・ロードする

前提

  • unity 2018.4.7f1
  • Android

できること

  • 一度、KeystoreとAliasのパスワードを設定してビルドすると、以降、エディター起動時に自動的に設定されるようになります。

やりかた

  • 以下のコードを、適当なAssets/~/Editor/~へ入れてください。
SaveKeystore.cs
using UnityEditor;
using UnityEditor.Callbacks;

public class SaveKeystore {

    private static string keystorePrefsName => PlayerSettings.Android.keystoreName;
    private static string keyaliasPrefsName => $"{PlayerSettings.Android.keystoreName}/{PlayerSettings.Android.keyaliasName}";

    [InitializeOnLoadMethod]
    private static void OnLoad () {
        if (string.IsNullOrEmpty (PlayerSettings.Android.keystorePass) && !string.IsNullOrEmpty (PlayerSettings.Android.keystoreName)) {
            PlayerSettings.Android.keystorePass = EditorPrefs.GetString (keystorePrefsName);
        }
        if (string.IsNullOrEmpty (PlayerSettings.Android.keyaliasPass)) {
            PlayerSettings.Android.keyaliasPass = EditorPrefs.GetString (keyaliasPrefsName);
        }
    }

    [PostProcessBuild]
    private static void OnBuilded (BuildTarget target, string path) {
        if (target == BuildTarget.Android) {
            if (!string.IsNullOrEmpty (PlayerSettings.Android.keystoreName) && !string.IsNullOrEmpty (PlayerSettings.Android.keystorePass)) {
                EditorPrefs.SetString (keystorePrefsName, PlayerSettings.Android.keystorePass);
            }
            if (!string.IsNullOrEmpty (PlayerSettings.Android.keyaliasName) && !string.IsNullOrEmpty (PlayerSettings.Android.keyaliasPass)) {
                EditorPrefs.SetString (keyaliasPrefsName, PlayerSettings.Android.keyaliasPass);
            }
        }
    }

}

留意事項

  • KeystoreおよびAliasのパスワードが、平文でエディターの設定内(EditorPrefs)に保存されます。
  • Keystoreファイルの絶対パスに依存します。プロジェクトフォルダを移動するとオートロードできなくなります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでAndroidのKeystoreパスワードを自動セーブ・ロードする

前提

  • unity 2018.4.7f1
  • Android

できること

  • 一度、KeystoreとAliasのパスワードを設定してビルドすると、以降、エディター起動時に自動的に設定されるようになります。

やりかた

  • 以下のコードを、適当なAssets/~/Editor/~へ入れてください。
SaveKeystore.cs
using UnityEditor;
using UnityEditor.Callbacks;

public class SaveKeystore {

    private static string keystorePrefsName => PlayerSettings.Android.keystoreName;
    private static string keyaliasPrefsName => $"{PlayerSettings.Android.keystoreName}/{PlayerSettings.Android.keyaliasName}";

    [InitializeOnLoadMethod]
    private static void OnLoad () {
        if (string.IsNullOrEmpty (PlayerSettings.Android.keystorePass) && !string.IsNullOrEmpty (PlayerSettings.Android.keystoreName)) {
            PlayerSettings.Android.keystorePass = EditorPrefs.GetString (keystorePrefsName);
        }
        if (string.IsNullOrEmpty (PlayerSettings.Android.keyaliasPass)) {
            PlayerSettings.Android.keyaliasPass = EditorPrefs.GetString (keyaliasPrefsName);
        }
    }

    [PostProcessBuild]
    private static void OnBuilded (BuildTarget target, string path) {
        if (target == BuildTarget.Android) {
            if (!string.IsNullOrEmpty (PlayerSettings.Android.keystoreName) && !string.IsNullOrEmpty (PlayerSettings.Android.keystorePass)) {
                EditorPrefs.SetString (keystorePrefsName, PlayerSettings.Android.keystorePass);
            }
            if (!string.IsNullOrEmpty (PlayerSettings.Android.keyaliasName) && !string.IsNullOrEmpty (PlayerSettings.Android.keyaliasPass)) {
                EditorPrefs.SetString (keyaliasPrefsName, PlayerSettings.Android.keyaliasPass);
            }
        }
    }

}

留意事項

  • KeystoreおよびAliasのパスワードが、平文でエディターの設定内(EditorPrefs)に保存されます。
  • Keystoreファイルの絶対パスに依存します。プロジェクトフォルダを移動するとオートロードできなくなります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity]Tips:インスペクターにHDRモードのグラデーションを表示するには。

普通モードとHDRモードの違い

普通モードとHDRモードの違いは、カラーの発光レベルを設定できるかどうか。
color.png

表示方法

グラデーションをインスペクターに表示するには、

HDRgradient.cs
        [GradientUsage(true)] public Gradient color;

という具合に、GradientUsageというアトリビューションを記述するだけ。
ちょっとつまずいたけど、日本語での検索にヒットしなかったからメモがてらに投稿してみました、現場からは以上です。

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

イマーシブ ヘッドセットのチュートリアルをやってみる - MR 基礎 100

はじめに

Windows MR、Unity 初心者です。
Microsoft 公式のチュートリアルであるイマーシブ ヘッドセットのチュートリアルを行ってみようと思います。
チュートリアルは以下のチュートリアルです。

MR 基本 100 - Unity の概要 - Mixed Reality | Microsoft Docs

環境

  • Windows 10 Pro Version 1903
  • Unity 2018.4.6f1
  • Visual Studio Community 2019
  • Mixed Reality ポータル

Chapter 1 - 新しいプロジェクトを作成する

  1. Unity Hub を起動します。
  2. [新規作成] を選択します。
  3. [テンプレート] から [3D] を選択します。
  4. [プロジェクト名] に [MixedRealityIntroduction] を入力します。
  5. [保存先] を入力します。
  6. [作成] を選択します。

    tutorials100-1.png

Chapter 2 - カメラのセットアップ

  1. [File] > [Save As] から Scene を保存します。
    • ファイル名は [Main] とします。
  2. Hierarchy ウィンドウから [Main Camera] を選択します。
  3. Inspector ウィンドウの [Transform] > [Position] を (X : 0, Y : 0, Z : 0) に設定します。

    • メインカメラはユーザーの頭の動きを追跡しているため、メインカメラの開始位置を設定することで、ユーザーの開始位置を設定できます。]
    • ユーザーの開始位置を(X:0、Y:0、Z:0)と想像すると、アプリのレイアウトが簡単になります。

    tutorials100-2.png

  4. Inspector ウィンドウの [Camera] > [Clear Flags] を [Skybox] に設定します。

    • Unity のデフォルトで [Skybox] に設定されています。
    • HoloLens の場合は、Background の RGBA の値を (0, 0, 0, 0) に設定します。

    tutorials100-3.png

  5. Inspector ウィンドウの [Camera] > [Clipping Planes] > [Near] を [0.3] に設定します。

    • Unity のデフォルトで [0.3] に設定されています。
    • ユーザーとオブジェクトが近づいた時に、オブジェクトが表示されないようになります。

    tutorials100-4.png

Chapter 3 - プロジェクト設定のセットアップ

Unity のパフォーマンスと品質の設定

  1. [Edit] > [Project Settngs] > [Quality] を選択します。
  2. Windows アイコンの列の一番下にある [▼] を選択し、[Very Low] を選択します。

    • Windows アイコン列の Very Low 行の ☑ が緑色になります。
    • 高フレームレートを維持し、最高のパフォーマンスを出すための設定です。

    tutorials100-5.png

ターゲットWindows 10 SDK

  1. [Edit] > [Project Settngs] > [Player] を選択します。
  2. Windows アイコンを選択します。
  3. [XR Settings] を開きます。
  4. [Virtual Reality Supported] のチェックを入れます。

    tutorials100-6.png

Chapter 4 - キューブを作成する

  1. Hierarchy ウィンドウの [Create] から [3D Object] > [Cube] を選択します。

    tutorials100-7.png

  2. Hierarchy ウィンドウで作成した cube を選択します。

  3. Inspector ウィンドウの [Transform] > [Position] を (X : 0, Y : 0, Z : 0) に設定します。

    • 実世界ではユーザーポジションから 2m の位置になります。
  4. [Transform] > [Rotation] を(X : 45, Y : 45, Z : 45) に、[Scale] を(X : 0.25, Y : 0.25, Z : 0.25) に設定します。

    tutorials100-8.png

  5. [File] > [Save] から Scene を保存します。

Chapter 5 - Unityエディターからデバイスで確認する

  1. [File] > [Build Settings] を選択します。
  2. [Platform] を [Universal Windows Platform] を選択します。
  3. [Switch Platform] を選択します。

    tutorials100-9.png

  4. [Build Settings] ウィンドウを閉じて、Unity 画面上部にある ▶(Play)を選択します。

    • Mixed Reality ポータルが起動して、Cube が表示されます。

Chapter 6 - Visual Studioからデバイスにビルドして展開する

  1. [File] > [Build Settings...] を選択
  2. 「Add Open Scenes」を選択し、「Build」を選択
  3. ダイアログが表示されるため、任意の場所に出力
  4. 出力した中にある *.sln を Visual Studio で起動
  5. ターゲットを「Release」、「x64」に変更
  6. 「ローカル コンピューター」を選択

    • Windows Mixed Reality シミュレーターは ローカル コンピューター を選択すると自動的に起動します。

    MRTK20.png

  7. [デバッグ] > [デバッグなしで開始] を選択

さいごに

  • Windows MR のアプリ開発の基本的なことなので覚えておくとよさそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityのProBuilderをLWRP/HDRP対応する

はじめに

UnityでLWRP/HDRPに設定してProBuilderでゲームオブジェクトを作ると従来のシェーダーが使われているのでピンク色になってしまいます。ですがProBuilder 4.1.0以上でLWRP/HDRP対応マテリアル/シェーダーが追加されたのでその設定方法を解説します。

LWRP/HDRP向け設定手順

  1. Package ManagerからProBuilder 4.1.0以上をインストールします。
  2. Unity2019.1以上

    1. HDRP SupportもしくはLWRP SupportのImport in projectボタンを押します。 image.png
    2. /Assets/Samples/ProBuilder/4.1.0/にマテリアルとシェーダーがコピーされます。 image.png
  3. Unity2018.4以下

    1. Package ManagerがImport in projectボタンに対応していないのでUnityのプロジェクトタブ内の/Packages/ProBuilderをエクスプローラで開き、Samples~フォルダ内のHDRPもしくはLWRPをプロジェクト内にコピーします。 image.png image.png
  4. コピーしたマテリアルはプロジェクトタブ内でプレビューがピンク色になっている事がありますが再インポートで正常に表示されます。
    マテリアルはプロジェクト内のどこに配置しても構わないのですがファイル名を変えると自動割り当てされなくなるので注意してください。

以上の設定でProBuilderでゲームオブジェクトを作った時にLWRP/HDRPのマテリアルが自動で割り当てられます。

余談ですがマテリアルの自動割り当ては https://github.com/Unity-Technologies/com.unity.probuilder/pull/165 で取り込まれているようです。

image.png

ProBuilder 4.1.0未満の場合

  1. https://github.com/Unity-Technologies/com.unity.probuilder/tree/v4.1.0/Samples~ に4.1.0のLWRP/HDRP向けのマテリアルとシェーダーがあるのでプロジェクト内にコピーします。
  2. Unityの環境設定 > ProBuilder > Mesh Settings > Materialにコピーしたマテリアルを設定します。 image.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity,VFX]SDF(符号付き距離場)を使ったVFXパーティクル芸

SDF(Signed Distance Field)を使ったパーティクルによるメッシュ形成術

制作物は以下のようなものになります。SDFを使うことで、パーティクルが任意の地点をぐるぐると循環するようになります。
SDFが何たるかはここでは説明しませんのであしからず。

制作環境

Unity2019.1.0f2
※PackageManagerよりBurst、Mathmatics、Visual Effect Graphをインポートしておいてください。

UnityにはまだSDFをベイクする機能はありません

残念ながらSDFをベイクする公式ツールは提供されていないようですので、こちらからSDFrというプラグインをお借りします。
Package化されてないので、Assets/以下のフォルダを丸ごとプロジェクトに放り込んでください。

SDFrの使い方

SDF1.png

ベイクしたいオブジェクトにSDFbakerをアタッチします。使用したボタンは赤線をつけておきました。

  • Dimensions・・・ベイク後のTexture3Dのサイズになります。解像度はここを弄ってください。32^3で十分だと思います。
  • Encapsulate・・・モデルがちょうど収まるバウンドを設定してくれます。
  • Bake・・・ベイクします。書き込み先が設定されていなくてもファイルを作成してくれます。
  • Preview・・・ベイク結果を元のモデル位置に表示してくれます。このプレビューがうまくいってないとパーティクルが荒れます。

Tips

モデルデータのRead/Write Enabledをオンにしておきます。これをしておかないと以下のようにベイク結果が破綻します(二枚目はSDF Flipをオンにした状態)。この状態のSDFデータをVFXに流し込むと、パーティクルが特定の場所に滞留してしまい、うまくモデルを形成してくれません。
SDF2.png
SDF3.png

Visual Effect Graphのレシピ

SDF4.png

将来的には公式がベイク機能を提供するでしょう。

この記事と使用したプラグインは近い将来obsoleteされると思いますが、それまでの間はこの方法でSDFによるパーティクル芸を頑張りましょう!!!

参考文献

SDFr by xraxra, https://github.com/xraxra/SDFr

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

Unity に挫折した人向けゲームエンジン紹介

プログラムベースではなく、GUI レベルエディターが用意されていて、Unity より簡単にゲームが作れるゲームエンジン(ツール)をかき集めてみました。
Unity に挫折した人や、Unity を使うまでもないゲーム制作におすすめです。
主に HTML5 やスマホ向けにパブれるものが中心です。

CONSTRUCT 3

https://www.construct.net
次元:2D
出力:iOS、Android、HTML5、Windows、Mac、Linux
言語:選択式、JavaScript
価格:無料~有料

3 からエディターがブラウザ上で動作するようになった。
予め用意されたビヘイビアを利用して、作り上げていくタイプ。
珍しくオブジェクトにテキスト入力 GUI (フォーム)がある。
どっかで見たことあるようなゲームなら数時間で作れる。

GDevelop 5

https://gdevelop-app.com
https://gdevelop-app.com/ja/
次元:2D
出力:iOS、Android、HTML5、Windows、Mac、Linux
言語:選択式
価格:無料~有料

上記の construct に似ているが、後発なので機能的には劣る。
その分、無料でもすべての機能が使える。
エディターはブラウザ上で動作するお試し版もあるが、通常は変な場所にインストールしてくれるインストール版を利用する。
この変な場所にインストールしてくれるインストール版には簡単なイメージエディタも含まれる。
サイトには一切書かれていないが、ソフトをインストールすると有料プランの紹介がある。

PlayCanvas

https://playcanvas.com/
https://playcanvas.jp/
次元:3D
出力:HTML5
言語:JavaScript
価格:無料~有料

ブラウザ上で本格的な 3D ゲームが作成できる。
日本では GMO が管理しているので、ドキュメントが日本語化されている。
Unity に近いので、こいつを使う意義を見出しにくいが、WebGL を利用してブラウザ上で動作するゲームを作りたい場合は、こちらに分がある様子。

RPGツクールMV、ラノゲツクールMV、アクションゲームツクールMV

https://tkool.jp/
次元:2D
出力:iOS、Android、HTML5、Windows、Mac
言語:選択式、Javascript
価格:有料

コンシューマーゲーム機向けは9割地雷であることで有名なツクールシリーズ。
PC 向けの MV 系は比較的安心で、ツクール感のないゲームを制作することも可能だが、ご多分に漏れず MV Trinity は N2 地雷なので注意。
たまに Steam で 80% OFF とかになってたりするので、定価で購入すると数週間後に泣きを見たりする。
なお、2019年8月現在、アクションゲームツクールMVは早期アクセス中で、パブリッシュは Win(exe)のみ。

Stencyl

http://www.stencyl.com/
次元:2D
出力:iOS、Android、HTML5、Windows、Mac、Linux、Flash
言語:ドラッグアンドドロップ、Haxe
価格:無料~有料

Scratch のようにブロックを組み合わせてプログラミングする。
タイルマップをアニメーションさせることができる点はすごい。
ビヘイビアを作ることもできるが、予め用意されている公式のビヘイビアが総じてクソ。
さらにユーザーが作ったビヘイビアも総じてゴミ。
若干時代に乗り遅れてる感があり、悪くはないが良くもない印象。
あ、あと日本語の扱いが苦手。

Defold

https://www.defold.com
https://www.defold.com/japan/
次元:2D
出力:iOS、Android、HTML5、Windows、Facebook
言語:Lua
価格:無料

エディターはあるけど、結局ごりごりプログラミングしないとダメなタイプ。
アプリ内購入は標準でサポートしているが、広告によるマネタイズはサードパーティー提供のエクステンションに頼る必要がある。

Godot

https://godotengine.org
次元:2D、3D
出力:iOS、Android、HTML5、Windows、Mac、Linux
言語:GDScript、他
価格:無料

使用する言語は複数対応しているがメインは GDScript という Python に似た言語。
VisualScript も用意されている。
2D ライトが使える。
admob などは GitHub などで提供されているものを使う。
ぶっちゃけ試してない。

Buildbox

https://www.buildbox.com/
次元:2D、3D
出力:iOS、Android、Windows
言語:選択式
価格:有料

有料だから試してない。

GameMaker Studio 2

https://www.yoyogames.com/
次元:2D
出力:iOS、Android、HTML5、Windows、Mac、Linux
言語:ドラッグアンドドロップ、GML
価格:30日間トライアル~有料

試してn

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

UnityでVisual Studioのインテリセンス(自動補完/候補)が出ない場合の直し方

[背景]

UnityをスクラッチからインストールしたはずなのにどういうわけだかVisual Studioがインストールされていなかった。
多分、いや間違いなく俺が悪い。

そこでUnity Hubから、左側のメニューのインストール → 該当するUnityの右上の3点をクリック → モジュールを加える → Microsoft Visual Stuido Community 2017の左のマスをクリック → 実行!

で、いそいそとUnityのメニューから Assets → Open C# Project でScriptを書き始めたがインテリセンス(自動補完/候補)が出ない(泣) ← 今ここ

[直し方]

かいつまんで言えば、↓ これを行う。

Visual Studio で使用するために Unity を構成する

  1. [Edit](編集) メニューから [Preferences](ユーザー設定) を選びます。

  2. [Preferences](ユーザー設定) ダイアログで、[External Tools](外部ツール)タブを選びます。

  3. [External Script Editor](外部スクリプト エディター) ドロップダウン リストから、目的のバージョンの Visual Studio が一覧にある場合はそれを選び、ない場合は [Browse](参照) を選びます。

  4. [Browse...](参照...) を選択した場合は、Visual Studio インストール ディレクトリの中の Common7/IDE ディレクトリに移動し、devenv.exe を選択します。 次に、[Open](開く) をクリックします。

  5. [External Script Editor](外部スクリプト エディター) の一覧から Visual Studio を選択した後、[Editor Attaching](エディターのアタッチ) チェックボックスがオンになっていることを確認します。

  6. [Preferences](ユーザー設定) ダイアログを閉じて、構成プロセスを完了します。

Enjoy!

以上

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

【uGUI】元サイズに合わせて適切にアスペクト比を修正するRawImageの拡張メソッド【FixAspect()】

この記事は「Unityゆるふわサマーアドベントカレンダー 2019」 27日目の代理投稿です。昨日は@UnagiHuman さんの「OculusQuestとRealsenseを接続してPointCloudを見る」でした。

はじめに

RawImageTextureをuGUI上で描画できるコンポーネントです。UIを組む時などはImageを使うことが多いと思いますが、動的なテクスチャを扱う場合にはRawImageの方が便利な時があります。そんな時に使える拡張メソッドを紹介したいと思います。

Aug-15-2019 21-59-59.gif

この拡張メソッドでは、上記Gif画像のようにUIのサイズに合わせて最大の大きさでアスペクト比を自動調整します。強みとしてはAnchorの状態に関わらず使うことができるので、StretchさせたUIパーツにも適用しやすいと思います。

使い方

サンプル(nkjzm/FixAspectSample)の中にあるRawImageExtensions.csをプロジェクトにインポートしてください。

拡張メソッドとして用意してあるので、適用したいRawImageから以下の様に呼び出せます。

[SerializeField] RawImage rawImage = null;
void Start()
{
    rawImage.FixAspect();
}

気軽に使えるImageFitter.csも用意しました。UIにアタッチすると、付けた時、再生した時、コンポーネントのメニューから「FixAspect」を選択した時に自動的に適用してくれます。とりあえず試したい時とかにオススメです。

また、上記は元のUIサイズを基準としているため、異なるサイズのテクスチャで繰り返し使用するとどんどんサイズが小さくなってしまうというありがちなミスがあります(下記gif画像参照)。

Aug-15-2019 22-34-46.gif

そこで引数にVector2を渡せるvoid FixAspect(this RawImage image, Vector3 originalSize)を用意しました。このような使い方を想定しています。

Vector2 initialSize;
void Start()
{
    initialSize = rawImage.rectTransform.rect.size;
}
void UpdateImage(Texture tex)
{
    rawImage.texture = tex;
    rawImage.FixAspect(initialSize);
}

こうしておくと何度適用しても元の大きさは変わりません。使い分けてください。

Aug-15-2019 22-35-50.gif

実装

FixAspectExtensions.cs
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// RawImageの大きさを変える拡張メソッド
/// </summary>
public static class FixAspectExtensions
{
    /// <summary>
    /// アスペクト比に合わせてRawImageのサイズを修正する
    /// 現在のUIサイズが基準となる
    /// </summary>
    public static void FixAspect(this RawImage image)
    {
        image.FixAspect(image.rectTransform.rect.size);
    }
    /// <summary>
    /// アスペクト比に合わせてRawImageのサイズを修正する
    /// </summary>
    /// <param name="originalSize">基準となるUIサイズ</param>
    public static void FixAspect(this RawImage image, Vector3 originalSize)
    {
        var textureSize = new Vector2(image.texture.width, image.texture.height);

        var heightScale = originalSize.y / textureSize.y;
        var widthScale = originalSize.x / textureSize.x;
        var rectSize = textureSize * Mathf.Min(heightScale, widthScale);

        var anchorDiff = image.rectTransform.anchorMax - image.rectTransform.anchorMin;
        var parentSize = (image.transform.parent as RectTransform).rect.size;
        var anchorSize = parentSize * anchorDiff;

        image.rectTransform.sizeDelta = rectSize - anchorSize;
    }
}

解説

uGUIの仕組みをある程度理解している人向けです。

ポイントとなるのがsizeDeltaで、これは「Anchorで定義された領域との差分」を表しています。例を上げると、Anchorがストレッチしていない場合(AnchorMinAnchorMaxが一致している状態)のsizeDeltaは矩形(Rect)のサイズと一致します。何故ならAnchorで定義された領域は点であるため、矩形のサイズはsizeDeltaのみで表現されている状態だからです。また、Anchorがストレッチしていて、かつTop,Rightなどの余白が0の時、sizeDelta(0,0)となります。Anchorで定義された領域と矩形のサイズが完全に一致しているため、「Anchorで定義された領域との差分」がない状態だからです。これを理解できると、ストレッチしているかどうかに書かわらず処理を一般化することが出来ます。

まずは前半部分です。

var textureSize = new Vector2(image.texture.width, image.texture.height);

var heightScale = originalSize.y / textureSize.y;
var widthScale = originalSize.x / textureSize.x;
var rectSize = textureSize * Mathf.Min(heightScale, widthScale);

これは処理後の大きさを求めるためのブロックです。テキスチャサイズを基準に、縦と横で元のUI要素のサイズの比率を比べています。それぞれが縦幅に合わせた時、横幅に合わせた時の最大のスケールを表しているため、小さい方を採用することで領域をはみ出ない最も大きなサイズになります。最後の行ではtextureSizeに最適なスケールが掛け合わされることで、最終的なUIの大きさが求められました。

次のブロックではAnchorで定義された領域を求める処理をしています。

var anchorDiff = image.rectTransform.anchorMax - image.rectTransform.anchorMin;
var parentSize = (image.transform.parent as RectTransform).rect.size;
var anchorSize = parentSize * anchorDiff;

anchorDiffはAnchorで表される領域の相対的な大きさです。(0,0)なら領域は点となり、(1,1)なら親サイズと一致するサイズになります。次の行では親のサイズを習得しています。rectには常に矩形のサイズが入っているので便利ですが、代入することは出来ない点に注意です。最後の行では領域の具体的なサイズを計算しています。Vector2同士の掛け算では各要素をかけてくれるので、このように書くことが出来ました。

そして最後の行です。

image.rectTransform.sizeDelta = rectSize - anchorSize;

これはまさに「Anchorで定義された領域との差分」という言葉通りで、最終的なサイズからAnchorで定義された領域を引くことでsizeDeltaが求められます。

最後に

GitHubにMITで置いてあるのでお気軽にご利用ください。
nkjzm/FixAspectSample

「Unityゆるふわサマーアドベントカレンダー 2019」 28日目の担当は @tan-y さんです。

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

MuJoCo Unity Pluginのインストール方法

MuJoCo Unity Pluginを使用する動機

ビデオが開けなかった
Unityのレンダリングエンジンを利用して、MuJoCoシミュレータの見た目をよりリアルにできる。
Unityエディタを使い慣れている人にとっては、MuJoCoシミュレータがより扱いやすくなると思われる。

インストールのフロー

  1. Unityをインストール
  2. MuJoCoをインストール
  3. MuJoCo Unity Pluginをインストール

Unityをインストール

こちらのサイトからダウンロードとインストール。
詳しい方法は省略(Unityのダウンロード〜インストールまで徹底解説などの記事を参照)。

MuJoCoをインストール

Lisenceページからライセンスを取得し、ProductsページからMuJoCo Proをダウンロードとインストール。
ライセンス取得に関しては物理エンジンmujoco登録の仕方などを参照。
登録に成功するとメールが届くので、添付してあるmjkey.txtをダウンロードする。
現時点(19/8/27)でプラグインに対応しているのがv1.5なのでmjpro150をダウンロード・解凍。
こちらを参考に以下のようにする。
1. ホームディレクトリの下に./mujocoディレクトリを作成。
2. ./mujocoの下にダウンロードして解凍したmjpro150ディレクトリを移動。
3. ./mujocoの下にmjkey.txtを置く。

MuJoCo Unity Pluginをインストール

ProductsページからMuJoCo Plugin and Unity Integrationをダウンロード。
現在(19/8/27)の最新版はmjuni155なのでこれをダウンロード・解凍。
公式ドキュメントのWorkflowを参考に以下のようにする。
1. Unityのプロジェクトを開く。
2. 解凍したmjuni155_macos/Toolsディレクトリ(※macOSの場合)の下にあるPlugins, ScriptsディレクトリをUnityプロジェクトのAssetsディレクトリの下に置く。正しくコンパイルされると、UnityエディタのメニューバーからWindow -> MuJoCo Importが選択できるようになる。
3. Window -> MuJoCo Importをクリックして、MuJoCo ImportウィンドウのBrowse...ボタンをクリックしてモデルを指定する。例えば、mjuni155_macos/Tools/Models/mjcf/pr2.xmlを指定し、Import Modelをクリックすると下のようにSceneにpr2が現れる。
スクリーンショット 2019-08-27 11.12.09.png

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

UnityにIronPythonを取り込む

古い記事が多く導入に手間取ったのでその際のメモを残します。

バイナリを取得してくる

こちら公式のアーカイブだと古いバージョンが無い為
nugetのアーカイブから持ってきます。
バージョンは好きなものを選択してください。

バイナリ取得後

ダウンロードすると '.nupkg' というファイル名になっていると思われるので、
拡張子を.zipに変更して解凍します。
(内部的にはzipなので、問題なく解凍できるはずです)

※一部Macで解凍してもzip.cpgzファイルとなってしまうものがある場合は
ターミナルを開いて該当ファイルがあるディレクトリに移動し下記コマンドで解凍可能です。

# 下記コマンドは例です。(自身のバージョンに合わせて下さい)
$ unzip iron_python.2.7.X.zip

Unityに導入する

1, Assets以下にPluginsフォルダーを作成する
2, 下記DllをPlugins以下に配置する
3, 以上です。コンパイルエラーなど出ていなければ問題ないはずです。

  • IronPython.dll
  • IronPython.Modules.dll
  • Microsoft.Dynamic.dll
  • Microsoft.Scripting.AspNet.dll
  • Microsoft.Scripting.dll
  • Microsoft.Scripting.Metadata.dll

後は、他のIronPythonの資料を見て頂ければと思います。
大事なポイントを2つまとめました。

Point

  • nugetからバイナリを持ってくる
  • 上記dllを全て配置する

動作確認環境

動作確認した環境を載せておきます.

  • Unity2019.1.9f1
  • IronPython2.7.5(.Net4.5)

Reference

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

Unity:UI Elements でマウスのクリックイベントを取得する

はじめに

こんにちは、のんびりエンジニアのたっつーです。
ブログを運営しているのでよろしければ見てください。

今回は「いくつかサンプル書いたよ」の記事の1つ「 画像をパラパラ漫画風に動かす 」を解説したいと思います。
ぜひ、お付き合いいただければと思います(#^^#)

UI Elementsとは?

こちらの記事をご参照いただければと思います。

マウスイベントの取得方法

通常ではマウスイベントは、Button.Clicked とかのボタンがデフォルト定義してくれているイベントを使いますが、
今回ご紹介するのはもっと汎用的な低レベルな感じの実装になりますので様々なコントロールでマウスの移動・クリックなどのイベントが実装できます。

それでは、マウスイベントの実装をしてみたいと思います。

Editor フォルダを作成し、右クリックのメニューから「UIElements Editor Window」を選択してください。

image-38.png

「Sample3」を入力してください。

image-44.png

次に、Sample3.cs を以下のように変更してください。

Sample2.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;


public class Sample3 : EditorWindow
{
    [MenuItem("UIElementsSamples/Sample3")]
    public static void ShowExample()
    {
        Sample3 wnd = GetWindow<Sample3>();
        wnd.titleContent = new GUIContent("Sample3");
    }

    public void OnEnable()
    {
        VisualElement root = rootVisualElement;

        root.AddManipulator(new MouseEventLogger());
        root.Add(new Label() { style = { backgroundColor = Color.yellow }, text = "output console log!" });
    }

    class MouseEventLogger : Manipulator
    {
        protected override void RegisterCallbacksOnTarget()
        {
            target.RegisterCallback<MouseUpEvent>(OnMouseUpEvent);
            target.RegisterCallback<MouseDownEvent>(OnMouseDownEvent);
        }

        protected override void UnregisterCallbacksFromTarget()
        {
            target.UnregisterCallback<MouseUpEvent>(OnMouseUpEvent);
            target.UnregisterCallback<MouseDownEvent>(OnMouseDownEvent);
        }

        void OnMouseUpEvent(MouseEventBase<MouseUpEvent> evt)
        {
            Debug.Log("Mouse Up " + evt + " in " + evt.propagationPhase + " for target " + evt.target);
        }

        void OnMouseDownEvent(MouseEventBase<MouseDownEvent> evt)
        {
            Debug.Log("Mouse Down " + evt + " in " + evt.propagationPhase + " for target " + evt.target);
        }
    }
}

動作結果

どうでしたか簡単に実装が行えたと思います。
Unityのメニューから、「UIElementsSamples -> Sample3」を選択して実行を確認してみてください。

image-45.png

sample3.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

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

Unity:UI Elements でツールバーを実装する

はじめに

こんにちは、のんびりエンジニアのたっつーです。
ブログを運営しているのでよろしければ見てください。

今回は「いくつかサンプル書いたよ」の記事の1つの共通コントロールの作成方法と使い方を解説したいと思います。
ぜひ、お付き合いいただければと思います(#^^#)

UI Elementsとは?

こちらの記事をご参照いただければと思います。

ツールバーの実装

さっそくですが、ツールバーの実装をしてみたいと思います。

Editor フォルダを作成し、右クリックのメニューから「UIElements Editor Window」を選択してください。
image-38.png

「Sample2」を入力してください。
image-42.png

以下の3ファイルが生成されました、次にこの3ファイルを編集したいとおもいます。
image-43.png

Sample2.uss は使わないので削除してください!

次に、Sample2.uxml を以下のように変更してください。

Sample2.uxml
<?xml version="1.0" encoding="utf-8"?>
<engine:UXML
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:engine="UnityEngine.UIElements"
    xmlns:editor="UnityEditor.UIElements"
    xsi:noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd"
    xsi:schemaLocation="UnityEngine.UIElements ../../UIElementsSchema/UnityEngine.UIElements.xsd">

  <engine:Label text="Sample2 UXML" />
</engine:UXML>

次に、Sample2.cs を以下のように変更してください。

Sample.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;


public class Sample2 : EditorWindow
{
    [MenuItem("UIElementsSamples/Sample2")]
    public static void ShowExample()
    {
        Sample2 wnd = GetWindow<Sample2>();
        wnd.titleContent = new GUIContent("Sample2");
    }

    public void OnEnable()
    {
        VisualElement root = rootVisualElement;

        // Create Toolbar
        {
            var toolbar = new Toolbar();
            root.Add(toolbar);

            var btn1 = new ToolbarButton { text = "Button" };
            toolbar.Add(btn1);

            var spc = new ToolbarSpacer();
            toolbar.Add(spc);

            var tgl = new ToolbarToggle { text = "Toggle" };
            toolbar.Add(tgl);

            var spc2 = new ToolbarSpacer() { name = "flexSpacer1", flex = true };
            toolbar.Add(spc2);

            var menu = new ToolbarMenu { text = "Menu" };
            menu.menu.AppendAction("Default is never shown", a => { }, a => DropdownMenuAction.Status.None);
            menu.menu.AppendAction("Normal menu", a => { }, a => DropdownMenuAction.Status.Normal);
            menu.menu.AppendAction("Hidden is never shown", a => { }, a => DropdownMenuAction.Status.Hidden);
            menu.menu.AppendAction("Checked menu", a => { }, a => DropdownMenuAction.Status.Checked);
            menu.menu.AppendAction("Disabled menu", a => { }, a => DropdownMenuAction.Status.Disabled);
            menu.menu.AppendAction("Disabled and checked menu", a => { }, a => DropdownMenuAction.Status.Disabled | DropdownMenuAction.Status.Checked);
            toolbar.Add(menu);

            var spc3 = new ToolbarSpacer() { name = "flexSpacer2", flex = true };
            toolbar.Add(spc3);

            var popup = new ToolbarMenu { text = "Popup", variant = ToolbarMenu.Variant.Popup };
            popup.menu.AppendAction("Popup", a => { }, a => DropdownMenuAction.Status.Normal);
            toolbar.Add(popup);
        }

        // Import UXML
        {
            var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/Sample2.uxml");
            // var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/Sample2.uss");
            VisualElement labelFromUXML = visualTree.CloneTree();
            // labelFromUXML.styleSheets.Add(styleSheet);
            root.Add(labelFromUXML);
        }
    }
}

動作結果

どうでしたか簡単に実装が行えたと思います。
sample2.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

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

Unity:UI Elements でパラパラ漫画風のGUIを作ってみる。

はじめに

こんにちは、のんびりエンジニアのたっつーです。
ブログを運営しているのでよろしければ見てください。

今回は「いくつかサンプル書いたよ」の記事の1つの共通コントロールの作成方法と使い方を解説したいと思います。
ぜひ、お付き合いいただければと思います(#^^#)

UI Elementsとは?

こちらの記事をご参照いただければと思います。

パラパラ漫画風のGUIを作ってみよう

さっそくですが、ツールバーの実装をしてみたいと思います。

GUIの実装

Editor フォルダを作成し、右クリックのメニューから「UIElements Editor Window」を選択してください。
image-38.png

「Sample4」を入力してください。
image-46.png

次に、Sample4.cs を以下のように変更してください。
```C#:Sample4.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;

public class Sample4 : EditorWindow
{
[MenuItem("UIElementsSamples/Sample4")]
public static void ShowExample()
{
Sample4 wnd = GetWindow();
wnd.titleContent = new GUIContent("Sample4");
}

private Label label;
private Image image;
private SliderInt slider;

public void OnEnable()
{
    VisualElement root = rootVisualElement;

    // Import UXML
    var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/Sample4.uxml");
    var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/Sample4.uss");
    VisualElement labelFromUXML = visualTree.CloneTree();
    labelFromUXML.styleSheets.Add(styleSheet);
    root.Add(labelFromUXML);

    this.label = root.Q<Label>("label");
    this.image = root.Q<Image>("image");
    this.slider = root.Q<SliderInt>("slider");

    slider.RegisterValueChangedCallback<int>(Slider_ValueChanged);
}

private void Slider_ValueChanged(ChangeEvent<int> evt)
{
    this.label.text = $"page {evt.newValue}/{slider.highValue}";
    var backgroundTexture = Resources.Load<Texture2D>($"img_{evt.newValue}");
    this.image.style.backgroundImage = backgroundTexture;
}

}
```

次に、Sample4.uss を以下のように変更してください。

Sample4.uss
Label {
    font-size: 20px;
    -unity-font-style: bold;
    -unity-text-align: middle-center;
    color: rgb(68, 138, 255);
}

Image {
    padding-left: 20;
    padding-top: 20;
    height: 150;
    background-image: url("/Assets/Resources/img_0.png");
}

次に、Sample4.uxml を以下のように変更してください。

Sample4.uxml
<?xml version="1.0" encoding="utf-8"?>
<engine:UXML
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:engine="UnityEngine.UIElements"
    xmlns:editor="UnityEditor.UIElements"
    xsi:noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd"
    xsi:schemaLocation="UnityEngine.UIElements ../../UIElementsSchema/UnityEngine.UIElements.xsd
                        UnityEditor.UIElements ../../UIElementsSchema/UnityEditor.UIElements.xsd
                        UnityEditor.PackageManager.UI ../../UIElementsSchema/UnityEditor.PackageManager.UI.xsd">

  <engine:Label text="start" name="label" />
  <engine:Image name="image" />
  <engine:SliderInt low-value="0" high-value="92" value="1" name="slider" />
</engine:UXML>

画像リソースの準備

次に、「Resources」フォルダを作成して、その下に 「img_0.png」 「img_1.png」 「img_2.png」・・・ 「img_92.png」までの画像を格納してください。
image-37.png

動作結果

どうでしたか簡単に実装が行えたと思います。
Unityのメニューから、「UIElementsSamples -> Sample4」を選択して実行を確認してみてください。
image-48.png
sample4.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

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

Unity:UI Elements で共通コントロールを作成する

はじめに

こんにちは、のんびりエンジニアのたっつーです。
ブログを運営しているのでよろしければ見てください。

今回は「いくつかサンプル書いたよ」の記事の1つの共通コントロールの作成方法と使い方を解説したいと思います。
ぜひ、お付き合いいただければと思います(#^^#)

UI Elementsとは?

こちらの記事をご参照いただければと思います。

共通コントロールの実装

さっそくですが、共通コントロールの実装をしてみたいと思います。

共通コントロール

Editor フォルダを作成し、右クリックのメニューから「UIElements Editor Window」を選択してください。
image-38.png

「RedButton」を入力してください。
 ※つけたいコントロールの名前に変更してしまって、OKです。
image-39.png

以下の3ファイルが生成されました、次にこの3ファイルを編集したいとおもいます。
image-40.png

まずは、RedButton.uxml は使わないので削除してください!
※使っても実装できますが今回はスクリプトですべて生成していきます。

次に、RedButton.uss を以下のように変更してください。

RedButton.uss
Button {
    font-size: 15px;
    -unity-font-style: bold;
    color: rgb(255, 0, 0);
}

次に、RedButton.cs を以下のように変更してください。

また、独自イベントとして clicked を定義しており、ボタンを押下イベントに合わせて clicked が呼ばれるようにしております。
また、MyControls のネームスペースに変更するのをお忘れずに!

RedButton.cs
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine.UIElements;


namespace MyControls
{
    internal class RedButton : VisualElement
    {
        public new class UxmlFactory : UxmlFactory<RedButton, UxmlTraits> { }

        public new class UxmlTraits : VisualElement.UxmlTraits
        {
            UxmlStringAttributeDescription m_Text =
                new UxmlStringAttributeDescription { name = "text", defaultValue = "none label" };

            public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
            {
                get { yield break; }
            }

            public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
            {
                base.Init(ve, bag, cc);
                var text = m_Text.GetValueFromBag(bag, cc);
                ((RedButton)ve).Init(text);
            }
        }

        private Button m_button;

        public string text
        {
            get { return m_button.text; }
            set { m_button.text = value; }
        }

        public event Action<EventBase> clicked;

        public RedButton()
        {
            var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/RedButton.uss");
            styleSheets.Add(styleSheet);

            m_button = new Button();
            m_button.text = "noen label";
            m_button.clickable.clickedWithEventInfo += Button_Clicked;
            hierarchy.Add(m_button);
        }

        public RedButton(string text) : this()
        {
            Init(text);
        }

        public void Init(string text)
        {
            this.text = text;
        }

        private void Button_Clicked(EventBase eb)
        {
            eb.target = this;
            clicked?.Invoke(eb);
        }
    }
}

呼び出し側

次に呼び出し側の実装になります。
先ほどと同じよう入力ですが今回は「Sample1」で追加してください。

image-41.png

同じように3ファイルとも以下のように編集してください。

共通コントロールとして、以下の赤い文字のボタン(RedButton)を用意しました、これを使いまわせるパーツとして、ボタン1~3の計3つを作成しています。

ポイントとしては、「xmlns:my=”MyControls”」 で my:RedButton が使えるようになります。

Sample1.uxml
<?xml version="1.0" encoding="utf-8"?>
<engine:UXML
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:engine="UnityEngine.UIElements"
    xmlns:editor="UnityEditor.UIElements"
    xmlns:my="MyControls"
    xsi:noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd"
    xsi:schemaLocation="UnityEngine.UIElements ../../UIElementsSchema/UnityEngine.UIElements.xsd">

  <engine:Label text="Sample1 UXML" />

  <my:RedButton text="button1" name="btn1" />
  <my:RedButton text="button2" name="btn2" />
  <my:RedButton text="button3" name="btn3" />

  <engine:Label text="Sample1 UXML end" />
</engine:UXML>
Sample1.uss
Label {
    font-size: 20px;
    -unity-font-style: bold;
    color: rgb(68, 138, 255);
}

ポイントとしては、各ボタンイベント(Clicked)にイベントを紐づけるために「root.Q(“btn1”).clicked += ButtonClicked;」で実行しています。

Sample1.cs
using MyControls;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class Sample1 : EditorWindow
{
    [MenuItem("UIElementsSamples/Sample1")]
    public static void ShowExample()
    {
        Sample1 wnd = GetWindow<Sample1>();
        wnd.titleContent = new GUIContent("Sample1");
    }

    public void OnEnable()
    {
        VisualElement root = rootVisualElement;

        var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/Sample1.uxml");
        VisualElement labelFromUXML = visualTree.CloneTree();
        root.Add(labelFromUXML);

        root.Q<RedButton>("btn1").clicked += ButtonClicked;
        root.Q<RedButton>("btn2").clicked += ButtonClicked;
        root.Q<RedButton>("btn3").clicked += ButtonClicked;
    }

    void ButtonClicked(EventBase eventBase)
    {
        var redButton = (RedButton)eventBase.target;
        Debug.Log($"Clicked {redButton.text} RedButton!! ");
    }
}

動作結果

どうでしたか簡単に実装が行えたと思います。
今回は、RedButton.uxml は使わない実装でしたが使って実装する場合もそんなに難しくないと思いますのでぜひチャレンジしてみてください!

sample1.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

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

ドット絵のキャラクターを自然に3D空間に馴染ませるテクニック

前回の記事 の続き的な記事です!

馴染む!実に馴染むぞ!

ドット絵をドット絵のまま設置

まず、後の工程で光に当たるよう設定するため、スプライトを SpriteRender でシーンに配置します。

image.png

テクスチャはインポート時の設定だと自動的に圧縮がかかって若干ボヤけてしまいます。

image.png

ドット絵のようにアウトラインが大事なものはこれだと困るので、圧縮を切っちゃいます。

  • Filter Mode を Point(no filter)
  • Compression を None

image.png

これでくっきり表示されます。

影を作るRenderer設定&マテリアル作成

SpriteRendererオブジェクトは、デフォルトでは光によって明るくなったり、後ろに影を落としたりしません。

◆SpriteRendererが影を作れるようにする

SpriteRendererコンポーネントのInspectorで設定します。
が、通常時はSpriteRendererの影に関する設定メニューが表示されません。

image.png

Inspectorの右上の ▼ をクリックして、Inspectorのモードを Debug に変えると・・・

image.png

設定メニューが増えます。
この中の Cast ShadowON にすることで、SpriteRendererが影を作れるようになります。
が、まだこれでは影が表示されません。

◆影を落とせるマテリアルを作る

Projectフォルダで右クリック → Create → Material
作成されたMaterialのシェーダーを選択して・・・

image.png

ShaderStandard であることを確認して、Rendering ModeCutout にしましょう。
※さっきInspectorのモードをDebugのままにしてる人は元に戻しておくこと!

このマテリアルを、さっき影の設定をしたSpriteRendererのMaterialに設定すると・・・

image.png

見事!影が表示されました。

ドット絵に凹凸の情報を付与

ここまでの工程でそれなりに3D空間に馴染むのですが、もうちょっとできることがあるのでやってみました。
それは Normal Map を与えることです。(面の凸凹情報)
凸凹情報があることで、光を受ける角度が変化したときによりリアルな陰影の変化が生まれます。

◆Normal Mapの自動生成

Normal Mapは本来テクスチャに合わせて繊細に制作する必要があるのですが、手っ取り早く試したいので、NormalMap-Online というWebアプリを利用しました。

image.png

一番左の欄に画像をドラッグ&ドラッグする だけで結果が出ます。
画面下部の Download でファイルを保存できます。
※InvertのRにチェックを入れてたほうがいいかも?たぶん・・・?(使う画像によるかも)

image.png

ダウンロードした画像(Normal Map)をインポートしたら、Texture TypeNormal map にしておきましょう。

image.png

SpriteRendererのマテリアルの Normal Map に反映すると・・・

image.png

これが・・・

image.png

こうなる。
おお、なにやら迫力が出てきたぞ。

ダメ押しにBloomをかける

Bloom とは、画面内の輝度が高いところをボヤけさせてリアルな明かりや照り返しを表現するフィルターみたいな技術です。

  • AssetStoreから Post Processing Stack をダウンロードして、プロジェクトにインポート。
  • シーン内のカメラに Post Processing Befaviour コンポーネントをアタッチ
  • Prijectビューで右クリック → Create → Post-Processing Profile を作成

image.png

Bloom にチェックを入れる。
タブを開くとパラメータを調整できます。(詳しくは こちら

image.png

さきほどカメラにアタッチした Post Processing Befaviour コンポーネントに、作成した Post-Processing Profile を渡せば・・・

image.png

このとおり。もう平面とは言えない!!・・・かもしれない。

所感

3Dモデルのマテリアルでできることをそのまま適用しただけなので、2Dならではの表現がもっと深掘りできるといいな。。

次やるときは、こういうボリュームライトをの組み合わせや、逆光時の見栄えの研究をしてみようかなと思います。

2019/08/28 続編記事 出しました!

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