20200210のUnityに関する記事は13件です。

TextMeshProを使ったVCIをファイル経由で別プロジェクトへ取り込んだ場合にExportできない場合の対策

概要

TextMeshProを使ったVCIを出力できないことがあったので共有します。

Version

Unity 2019.3.0f6
UniVCI-0.24

現象

TextMeshProを使ったVCIをファイル出力して、別のプロジェクトに取り込んでprefabを配置してから、改めてExportすると出力できません。

原因1

別プロジェクトでVCIのファイルを取り込み、prefabが生成された時点で、TextMeshProの子に作った覚えのないオブジェクトが含まれています。これが何故生成されるかまでは調べていません。
image.png
※画像がUnity 2019.3.0f6ではないがですが許してください。

対策1

作った覚えのないオブジェクトを削除します。

原因2

UnityEditorを再生すると、再生した時点でこの覚えのないオブジェクトが生成されます。

対策2

TextMeshProに日本語表示用のフォントをアタッチします。
https://virtualcast.jp/wiki/doku.php?id=vci:sdk:text:introduction

備考

日本語使ってなければ起きない?

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

【Unity】iOSでセーブデータを読み書きする

概要

UnityでiPhoneの実機テストをした時に
ファイルの読み書きにつまづいたのでメモを残します。

環境

Unity 2019.2.10f1
Xcode ver.11.3.1
iOS 13.2

サンプル

データ

[System.Serializable]
public class SaveData
{
    public int stageNum = 3;
    public int[] score = new int[stageNum];
}

jsonなので配列も扱えますね。

セーブ

    public void Save(SaveData data){
        StreamWriter writer;
        string jsonData = JsonUtility.ToJson(data);

        writer = new StreamWriter(Application.persistentDataPath + "/savedata.json", false);
        writer.Write (jsonData);
        writer.Flush ();
        writer.Close ();
    Save(data);

pathにはApplication.persistentDataPathを使います。
StreamingAssetsは読み込み専用なのでセーブデータには適しません。
逆にアプリから書き換えることのないステージ情報などはStreamingAssetsを使うのが良いと思います。
・参考
StreamWriterの第二引数はtrueで追記、falseで上書きとなります。

ロード

    public SaveData Load(){
        string data = "";
        StreamReader reader;

        reader = new StreamReader(Application.persistentDataPath + "/savedata.json");
        data = reader.ReadToEnd ();
        reader.Close ();

        return JsonUtility.FromJson<SaveData>(datastr);
    }
    SaveData data = Load();
    print(data.score[0]);

リセット

    public void ResetData(){
        // 初期状態のデータをセーブ
        SaveData data = new SaveData();
        Save(data);
    }
    ResetData();

初回起動のとき

    void Start() {
        if (System.IO.File.Exists(Application.persistentDataPath + "/savedata.json") == false) {
            ResetData();
        }   
    }

jsonデータがないときにデータを作成します。
開発の段階であらかじめpersistentDataPathにjsonファイルを置いておくことはできません。

終わりに

iOS以外のプラットフォームでは処理を分ける必要がある場合があります。
間違い等あればご指摘願います。

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

TextMeshProを使ったVCIをexe(runtime)実行で出力

概要

VCIをexe(runtime)実行で出力するときに困ったことを共有します。

Version

Unity 2019.3.0f6
UniVCI-0.24

現象

TextMeshProを含むとexe(runtime)実行で出力できません。

原因

VCI.Exportから参照されるUniGLTF.ShaderPropExporter.ShaderPropsの中身にはUNITY_EDITORの記述があり、EditorはUnityEditor.ShaderUtilを使い、exe(runtime)ではUniVRMがそれ相当の実装を持つのですが、VRMはTextMeshProなど知らないので……、という予想です。

対策

無いなら作る。知らないなら教える。ということで、UniGLTF.ShaderPropExporter.PreShaderPropExporterにTextMeshPro/Distance Fieldをでっちあげます。ホントは中身があった方が良いと思いますが、無くても動いたので気にしないことにしました。

using System.Collections.Generic;


namespace UniGLTF.ShaderPropExporter
{
    public static partial class PreShaderPropExporter
    {
        [PreExportShader]
        static KeyValuePair<string, ShaderProps> TextMeshPro_Distance_Field
        {
            get
            {
                return new KeyValuePair<string, ShaderProps>(
                    "TextMeshPro/Distance Field",
                    new ShaderProps
                    {
                        Properties = new ShaderProperty[]{}
                    }
                );
            }
        }
    }
}

たぶん何処にどんな名前で保存しても良いと思うのですが、私は以下へ保存しました。
.\Assets\VRM\ShaderProperty\Runtime\TextMeshPro_Distance_Field.cs

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

TextMeshProを使ったVCIをexe(runtime)実行で出力できない場合の対策

概要

VCIをexe(runtime)実行で出力するときに困ったことを共有します。

Version

Unity 2019.3.0f6
UniVCI-0.24

現象

TextMeshProを含むとexe(runtime)実行で出力できません。

原因

VCI.Exportから参照されるUniGLTF.ShaderPropExporter.ShaderPropsの中身にはUNITY_EDITORの記述があり、EditorはUnityEditor.ShaderUtilを使い、exe(runtime)ではUniVRMがそれ相当の実装を持つのですが、VRMはTextMeshProなど知らないので……、という予想です。

対策

無いなら作る。知らないなら教える。ということで、UniGLTF.ShaderPropExporter.PreShaderPropExporterにTextMeshPro/Distance Fieldをでっちあげます。ホントは中身があった方が良いと思いますが、無くても動いたので気にしないことにしました。

using System.Collections.Generic;


namespace UniGLTF.ShaderPropExporter
{
    public static partial class PreShaderPropExporter
    {
        [PreExportShader]
        static KeyValuePair<string, ShaderProps> TextMeshPro_Distance_Field
        {
            get
            {
                return new KeyValuePair<string, ShaderProps>(
                    "TextMeshPro/Distance Field",
                    new ShaderProps
                    {
                        Properties = new ShaderProperty[]{}
                    }
                );
            }
        }
    }
}

たぶん何処にどんな名前で保存しても良いと思うのですが、私は以下へ保存しました。
.\Assets\VRM\ShaderProperty\Runtime\TextMeshPro_Distance_Field.cs

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

Unity 2019.3のHDRP (DXR使用)で簡単なシーンを作成 (Tier2)

HDRPでDXRを使用する手順については「Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成」をご参照くださいませ。
上記の作業直後では「Tier2」になっているようですので、そのまま進めます。
ここでは、シンプルなシーンでレイトレーシングの挙動を確認します。

HDRPの要素

HDRPの要素は「Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成」での指定より以下を使います。
hdrp_dxr_012.png

GameObject名 内容
Sky and Fog Volume Visual Environment/HDRI Sky/Fogなど。
背景とフォグの要素。
Post Process Volume Vignette/Exposure/White Balanceなど。
Post Procssingの要素。
Raytrace Settings Ray Tracing/Screen Space Reflection/Ambient Occlusionなど。

背景を変更

背景(IBLとしても使用)は、パノラマ(2:1の比率のequirectangularのexr/hdr)画像をキューブマップに変換して使用します。

equirectangularの以下のようなexr画像を作成しました。
unity_dxr_102.jpg
Insta360 EVOを使用し、HDRとして360度で撮影。
Affinity PhotoでHDRとして合成し、撮影者を消す加工を行い、exrファイルとして出力しました。

これをUnityのProjectにインポートします。
Inspectorウィンドウを開き、「Texture Shape」で「Cube」を選択して下にスクロールし、Applyボタンを押します。
unity_dxr_103.jpg
これで、equirectangular画像がキューブマップに変換されます。
unity_dxr_104.jpg
Hierarchyウィンドウから「Sky and Fog Volume」を選択し、Inspectorを表示します。
Projectウィンドウから背景のキューブマップファイルをInspector内の「Volume」-「HDRI Sky」内の「Hdri Sky」にドラッグします。
これで背景が指定のものに置き換わります。
unity_dxr_107.jpg
「HDRI Sky」の割り当てが存在しない場合は、「Add Override」ボタンを押して追加するようにします。

Fogを調整

HDRPの初期シーンから移行した直後はFog(霧)がかかっています。
調整は「Sky and Fog Volume」の「Fog Attenuation Distance」で減衰距離(単位 m)を指定します。
hdrp_dxr_105.jpg
値が大きいほど、霧は遠ざかります。
hdrp_dxr_106.png
霧はスクリーンに向かって奥方向と高さ方向の2つが使用されており、高さ方向を調整しないと水平線より下が白いままになってしまいます。
これを調整します。
左上の「All」を選択するとすべての項目が指定できるようになります。
hdrp_dxr_107.jpg
「Maxixmum Height」の値を大きくすることで、高さ方向(単位 m)に拡散していきます。
hdrp_dxr_108.jpg
ここでは、「Fog Attenuation Distance」を30000、「Maxixmum Height」を5000としました。
hdrp_dxr_109.jpg
ほんのわずかにフォグを与えています。
このフォグは、リアルな奥行き表現で重要な要素になります。
光が差し込んだときのほこりのような表現(ボリュームライト表現)や、空気感はフォグで表現できます。

オブジェクトを配置

オブジェクトとして、地面のPlane、Cylinder/Sphereを配置しました。
hdrp_dxr_101.jpg

Directional Lightの確認

このシーンの場合は、背景からのIBLとしての光源と、
「Directional Light」(平行光源)の2つが光源として作用します。
hdrp_dxr_102.png
Inspector内のLightの設定で、「Emission」の「Intensity」で明るさを指定します。
影は「Shadows」の「Shadow Map」の「Enable」をOnにして調整できます。

レイトレーシングの確認

マテリアルで鏡のような反射を割り当てて、レイトレーシングが機能しているか確認します。
Projectウィンドウ上を右クリックして新しくMaterialを作成します。
Inspectorを表示し、「Surface Inputs」の「Metallic」を1.0、「Smoothness」を1.0にします。
こうすることで、完全な鏡面反射になります。
これを球に割り当てます。
hdrp_dxr_110.jpg
LightmapやReflection Probeなどを使用していな状態でも、反射しているのを確認できます。
この段階ではScreen Space Reflection(SSR)が適用されています。

レイトレーシングのパラメータを調整

「Ray Tracing Settings」に割り当てているレイトレーシングのパラメータを調整します。
Inspectorウィンドウを開いたときの「Volume」に各要素が追加されていない場合は、「Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成」の手順で追加しておきます。

Ambient Occlusion

hdrp_dxr_111.jpg

「Ray Tracing」をOnにすると、レイトレーシングでのAOが使用されます。
Offにすると、SSAOとして動作します。
「Intensity」を大きくすることでAOの効果がかかります。
初期状態ではノイズがちらつくため「Denoise」をOnにします。
hdrp_dxr_112.jpg

Screen Space Reflection (SSR)

初期状態でも映り込みは反映されますが、
SSRの「Ray Tracing」をOnにすることで、レイトレーシングによるより正確な映り込みが表現されるようになります。
hdrp_dxr_113.jpg
Tier2の場合、反射回数を「Bounce Count」で指定できます。
Tier1の場合は、反射は1回だけです。

SSRパラメータの「Minimum Smoothness」値よりも反射があるマテリアルの「Smoothness」値が小さい場合、
映り込み効果は無効になります。
以下は、マテリアルのSmoothnessが0.8、SSRパラメータの「Minimum Smoothness」が0.9の場合です。
hdrp_dxr_114.jpg
映り込みは背景だけになっており、地面や円柱が映り込んでいません。
SSRパラメータの「Minimum Smoothness」を0.8とすると以下のようになります。
hdrp_dxr_115.jpg
MaterialのSmoothnessが1.0よりも小さい場合はラフネス効果がかかり、サンプリング数を増やす必要があるためノイズが出ることになります。
その場合は「Denoise」をOnにすると緩和されます。
hdrp_dxr_116.jpg

Global Illumination

GIの確認を行うため、cubeで壁や天井を配置しました。
GIが適用されていない場合は以下のようになります。
hdrp_dxr_117.jpg
「Global Illumination」の「Ray Tracing」をOnにすることで、GIの間接照明の効果がかかります。
hdrp_dxr_118.jpg
「Denoise」「Second Denoiser Pass」をOnにすることでノイズを緩和できます。
hdrp_dxr_119.jpg
Iter1の場合はGIとしての反復(再帰)回数は1回だけ、Iter2の場合は回数を指定できます。
Iter2で「Screen Space Reflection」と「Global Illumination」の「Bounce Count」を4とした場合は以下のようになります。
hdrp_dxr_120.jpg
ただし、「Bounce Count」を増やした場合はよりGPU負荷がかかることになります。
この「Bounce Count」の指定で強制的に指定回数分反射するからか、値を増やしたらより正確になる、というものでもなさそうです。
そのため、LightmapやReflection ProbeをこのGlobal Illuminationに置き換えることができるかというと、現状は難しいかもしれません。

Path Tracing (Iter2)

Iter2では「Path Tracing」を指定できます。
Iter1では指定できません。
hdrp_dxr_121.png
これを使用する場合、「Ambient Occlusion」「Screen Space Reflection」「Global Illumination」の指定は無視されるようです。
「Enable」をOnにすると有効になります。
「Maximum Depth」で反射回数の最大を指定します。
以下のようになりました。
hdrp_dxr_122.jpg
HDRP+DXRの表現では、一番現実に近い表現になるかと思われます。
なお、レンダリング時間がかかります(GTX1060では3秒以上)。

ただし、HDRI Skyの背景のExposureが極端に強くなったり、Fogがかからないようでした。
上画像は、HDRI Skyの背景の「Exposure」の値を10から1に変更しました。

また、Path Tracingを使用するとGPUリソースをたくさん消費するからか、シーンによってはうまくレンダリングされない場合がありました。

Post Processingの調整については「Unity 2019.3のHDRP (DXR使用)でのPost Procssing」をご参照くださいませ。

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

Unity 2019.3のHDRP (DXR使用)でのPost Procssing

Unity 2019.3 HDRPでDXRを使用していますが、調整は普通のHDRP使用時と同じになります。
HDRPでDXRを使用する手順については「Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成」をご参照くださいませ。

「Post Process Volume」のInspectorを開き、Post Processingの調整を行います。
各要素が存在しない場合は、「Add Override」ボタンを押し「Post-processing」より要素を追加するようにします。

ここではPost Procssingでよく使うパラメータを説明します。

デフォルト値

Post Processingは、個々の要素の指定がない場合はデフォルト値が参照されます。
デフォルトは、メインメニューの「Edit」-「Project Settings」の「HDRP Default Settings」より一覧できます。

Vignette

スクリーンの周囲を若干暗くして絵として安定させるエフェクトです。
「Intensity」でVignetteの強さを指定します。
hdrp_dxr_201.png
左がVignetteをOffにしたもの、右がOnにしたもの(Intensity 0.292)です。
hdrp_dxr_200.jpg

Exposure

全体の明るさを調整する露出です。
hdrp_dxr_202.png
「Mode」で「Fixed」を指定すると、固定の露出調整になります。
「Fixed Exposure」を小さくすると明るくなり、大きくすると暗くなります。
hdrp_dxr_203.jpg
背景のIBLは、「HDRI Sky」の「Exposure」で別途調整できます。
「Mode」で「Automatic」を選択した場合は、全体の明るさを自動調整します。
室内と室外を行き来する場合などに有効です。

White Balance

ホワイトバランスの調整を行います。
本来白である箇所を調整して合わせることで、自然な表現にします。
hdrp_dxr_204.png
下画像の場合は、「Temperature」(色温度)を調整し、若干青みかかっている色合いを暖色系にしています。
hdrp_dxr_205.jpg

Chromatic Aberration

色収差の調整を行います。
カメラのレンズを通して見たときの色ズレの表現になります。
hdrp_dxr_207.png
hdrp_dxr_206.jpg

Tonemapping

HDRのダイナミックレンジイメージをLDRに変換する際の方式を指定します。
フィルムの効果になります。
hdrp_dxr_208.png

hdrp_dxr_209.jpg
「Custom」でもう少し細かく調整できます。
また「External」を選択すると、外部で作成したルックアップテーブル(LUT)を指定できます。

Bloom

光がまぶしくて漏れ出しているような表現です。
Bloomをかけすぎるとぼやけて眠くなるため、適度にかけるとそれっぽいかもしれません。
hdrp_dxr_210.png
Intensityで強さを指定します。
以下はBloomを無効にした場合と、強めに指定した場合の比較です。
hdrp_dxr_211.jpg

Depth Of Field (DOF)

Game Viewで確認できます。Scene Viewでは反映されません。
被写界深度です。カメラの焦点が合っている距離範囲を指定することによるボケを表現します。
「Focus Mode」を「Manual」にすることで、カメラの手前側のボケ具合と、奥側のボケ具合を指定できます。
hdrp_dxr_212.png
左が被写界深度の指定なし、右がありです。
hdrp_dxr_213.jpg
背景がぼやけています。

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

Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成

UnityでのDXRの使用

Unity 2019.3でGPUのレイトレーシング(DXR)がHDRP上で使用できます。
2020年2月段階ではまだプレビュー版になります。

Unity 2019.3でのレイトレーシング対応については、以下が参考になります。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Ray-Tracing-Getting-Started.html

ここでは上記のマニュアル操作で、HDRPのDXRを使用する初期シーンを作成していきます。

確認環境

  • OS : Windows 10
  • GPU : NVIDIA GeForce GTX 1060 6GB
  • Unity : Unity 2019.3.0f6

DXRが使えるGPUについて

注意点として、DXRが使える環境でないとUnityのGPUのレイトレーシングは動作しません。

  • Windows 10環境 (Direct3D12が使える必要がある)
  • NVIDIA GeForce GTX 1060 6GB以降/ GeForce RTX20系

DXRについては、NVIDIAのサイトの説明をご参照くださいませ。

https://www.nvidia.com/ja-jp/geforce/news/geforce-gtx-dxr-ray-tracing-available-now/

DXRの効果

影/反射/透過(屈折)がレイトレーシングで行われます。
レイトレーシングとは、特定の位置(視点や光源など)から位置と方向を持ったレイを飛ばし、
シーン上の物体に当たるか判断するレンダリング手法です。
unity_dxr_101.png

レイトレースを使うことにより、光学的に素直なレンダリングができるようになります。
反射による映り込みや透過による屈折が、リアルタイムのフェイクではない現実に近づくことになります。
複雑な(というよりも再帰のある)計算になるため今までGPUには向かなかったのですが、昨今ではレイトレース処理をGPUで計算したり、
DXRのようにハードウェアで実装されたりしてきてます。
GPUでレイトレーシング処理を行えるようになることで、反射や透過、影などをリアルタイムで表現できるようになります。
ただし、依然負荷のかかる処理になるため、相応のGPU(RTX20系でより高価なもの)でないと重いです。
UnityのDXRでは、直接照明や一次反射にのみレイトレーシングを使う(Tier1)、
間接照明の計算(パストレーシング)でレイトレーシングを使う(Tier2)、の2つのモードがあります。

Unity 2019.3のHDRPでDXRを有効にする

Unity 2019.2以前ではDXRは実装されていません。
Unity 2019.3以降を使用します。

Unity Hubで新規プロジェクトを「HDRP」として作成します。
hdrp_dxr_000.jpg
Unity Editorを開き、メインメニューの「Window」-「RenderPipeline」「HD Render Pipeline Wizard」を選択します。
「HD Render Pipeline Wizard」ウィンドウの「HDRP + DXR」タブを選択し、「Fix All」ボタンを押します。
hdrp_dxr_001.png
途中で再起動を促されるのでUnity Editorを再起動します。
Unity Editor起動後に再度「HD Render Pipeline Wizard」ウィンドウを開き、
「HDRP + DXR」タブを選択し、「Fix All」ボタンを押します。
これにより、「HD Render Pipeline Wizard」ですべてのチェックボックスがOnになるのを確認します。

メインメニューの「Edit」-「Project Settings」を選択し、
「Player」タブを選択します。
「Other Settings」の「Auto Graphics API for Windows」チェックボックスがOffになっているのを確認。
「Graphics APIs for Windows」のリストの先頭に「Direct3D12 (Experimental)」が存在するのを確認します。
hdrp_dxr_002.png
また、Unity Editorウィンドウのキャプションに DX12 があるのを確認します。

Project Settingsの「Player」タブで、「Static Batching」チェックボックスをOffにします。

Scene Viewの表示のポップアップメニューを選択し、「Animated Materials」をOnにします。
hdrp_dxr_001_2.jpg
レイトレーシングの機能は、複数回のフレームでサンプリングを行う動作があります(Denoiseなど)。
「Animated Materials」がOnでない場合は、Scene Viewでの画面更新が繰り返し行われません。

レイトレーシングのモードについて

レイトレーシングのモードとして、速度優先の「Tier1」と品質優先の「Tier2」というものがあります。
「Tier1」は一次レイのみのレイトレーシングで使用できます。パストレーシングが使えません。
「Tier2」はレイの複数回の反射に対応しており、パストレーシング(間接照明)をDXRで動かすことができます。
ただし、それだけリソースの消費が大きく計算時間もかかります。

Projectウィンドウで「Settings/HDRenderPipelineAsset」を選択し、Inspectorを見ます。
これは、現在のサンプルシーンで割り当てられているHDRP用の設定ファイルになります。
hdrp_dxr_003.jpg
「Raytracing Tier」で「Tier1」か「Tier2」を選択できます。

HDRenderPipelineAssetを複製し、Tier1用とTier2用に分けて運用するのもいいかもしれません。
この指定は、メインウィンドウの「Edit」-「Project Settings」を選択し、Graphicsを選択します。
Scriptable Render Pipeline Settingsで指定できます。
hdrp_dxr_003_2.png
以上で、HDRPでDXRを使用できるようになりました。
その他の指定が HDRPのドキュメント には書いてありましたが、スキップしても動作しています。

シーンごとにProfileを複製または作成

サンプルシーンのうち「Sky and Fog Volume」と「Post Process Volume」に、HDRPで必要な設定が含まれています。
これらを、カラのGameObjectを作成し「Settings」と名前変更し、
この中にまとめるようにしました。
hdrp_dxr_004.png
それぞれは「Volume」のコンポーネントに要素がリストとして格納されています。

これらに含まれる情報は以下になります。

GameObject名 内容
Sky and Fog Volume Visual Environment/HDRI Sky/Fogなど。
背景とフォグの要素。
Post Process Volume Vignette/Exposure/White Balanceなど。
Post Procssingの要素。

これらは、Profileというファイルに情報が保存されます。
新規にシーンを作成したときにProfileが存在しない場合は作成(New)する必要があります。
既にProfileが存在する場合は複製(Clone)できます。
「Volume」コンポーネントでのProfileの作成や複製操作はすべて同じ手順になります。

Profileの作成 (New)

hdrp_dxr_005.png
Inspectorウィンドウで、Volumeコンポーネントの「Profile」でProfile名を選択すると、Project内で割り当てられているProfileが選択されます。
「New」ボタンを押すと、新しくProfileが生成されます。
Project上ではシーンファイル(*.unity)を保存したフォルダの直下に、シーンファイル名と同じフォルダが生成され、
そこにProfileが保存されます。
なお、lightmapの結果などはこのフォルダに格納されます。

Profileの複製 (Clone)

Inspectorウィンドウで、Volumeコンポーネントの「Profile」の「Clone」ボタンを押すと、
既存のProfileが複製されます。
保存場所は、複製元のProfileと同じフォルダ内です。
Projectウィンドウで、複製されたProfileをシーンファイル名と同じフォルダ内に入れておくのが管理しやすいかと思います。
例えば以下の画像の場合は、
「test.unity」が現在開かれているシーンの場合、同じフォルダ上の「test」フォルダにProfileを格納しておきます。
hdrp_dxr_006.png

LightingでのProfileを割り当て

lightmapを行うときに表示するLightingウィンドウを開きます。
ここでProfileの項目があるため、「Sky and Fog Volume」で割り当てたProfileを指定します。
hdrp_dxr_007.png
「Static Lighting Sky」で「HDRISky」を選択すると、
lightmapベイク時に背景IBLは「Sky and Fog Volume」内の「HDRISky」を参照します。

LightingでLightmap情報を削除

Lightingタブを選択し、「Generate Lighting」の「Clear Baked Data」を選択して、Lightmapデータを削除しておきます。
hdrp_dxr_123.png

その他の追加要素を指定するGameObjectを作成

Ambient OcclusionやScreen Space Reflection、Ray Tracingの関連要素を別のGameObjectに追加して管理することにします。

カラ(Empty)のGameObjectを生成し、「Ray Tracing Settings」と名前変更しました。
これを「Settings」のGameObject内に入れます。
hdrp_dxr_008.png
Inspectorウィンドウを開き、「Add Component」ボタンを押して、「Volume」を検索して追加します。
hdrp_dxr_009.png
Profileが存在しないため、「New」ボタンを押して追加します。
Profileの実体は、シーンファイル(*.unity)の直下のシーンファイル名のフォルダ内に保存されます。
「Add Override」ボタンを押して、必要な要素を追加します。
hdrp_dxr_010.png
以下のように追加しました。
hdrp_dxr_011.png

要素名 内容
Lighting/Ambient Occlusion 角部分など、光が入りにくい箇所を暗くする遮蔽
Lighting/Screen Space Reflection 後処理としての反射表現
Ray Tracing/Global Illumination 大域照明計算
Shadowing/Shadows 影表現

それぞれは、Project Settingsの「HDRP Default Settings」をオーバーライドするものになります。
それぞれの使い方については、別途説明していきます。

ひな型のシーンとして不要なGameObjectを削除し、保存

最低限シーンに必要な要素だけを残し、以下のようにしました。
hdrp_dxr_012.png
サンプルシーンとしての形状や光源、Light Probeは削除しました。

シーンでは、3つのProfileの作成(複製)と、Lightingに「Sky and Fog Volume」のProfileを割り当てる処理を行いました。
この処理は、プロジェクト内のシーンごとに別途指定するのがよいかもしれません。

Unity 2019.3のHDRP (DXR使用)のその他の記事

更新履歴

2020/02/12

  • Unity 2019.3のHDRP (DXR使用)のその他の記事にページを追加
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プレハブ化したオブジェクトの座標を取得

はじめに

この記事の対象者
・プレハブの座標を取得したい人
・オブジェクトの座標を取得したい人

プログラム

通常オブジェクトの場合

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class game Object : {
    public GameObject Prefab;
    void Start () {
    Debug.Log(Prefab.transform.position.x);//(オブジェクト.transform.position.座標)
    }

    void Update() {

    }
}

プレハブの場合

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class game Prefab: {
    public GameObject Prefab;
    void Start () {
    Prefab = GameObject.Find(Prefab);//Prefabをシーンから探してPrefabに代入する
    Debug.Log(Prefab.transform.position.x);//(オブジェクト.transform.position.座標)
    }

    void Update() {

    }
}

Findは処理が重くなってしまうのであまり多様するのは良くない

まとめ

[オブジェクト名.transform.position.座標]でオブジェクトの座標を取得する
[GameObject名 = GameObject.Find(オブジェクトの名前);]でプレハブを使えるようにする
詳しくはunity スクリプトリファレンスへどうぞ

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

Unity NetCode 使用時のエラーの解決法

はじめに

ゲーム開発時にUnity NetCodeをInstallして、「さて、ゲームを作ろう」という時に、いきなりエラーが出てしまいます。
本記事ではそのエラーを解決する方法を書きました。

環境

  • Unity 2019.3.0f6
  • Unity NetCode preview.0 - 0.0.4

問題

Package ManagerからUnity NetCodeをInstallすると次のようなエラーが出ます。

Library/PackageCache/com.unity.netcode@0.0.4-preview.0/Runtime/ClientServerWorld/ClientServerBootstrap.cs(31,33): error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IReadOnlyList<System.Type>' to 'System.Collections.Generic.List<System.Type>'

解決法

ClientServerBootstrap.cs31行目

GenerateSystemLists(systems);

を次のように変更します。

GenerateSystemLists(systems as List<Type>);

参考

Getting started with NetCode Error CS1503 - Unity Forum

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

mapboxで簡単地形表現

mapboxを使うことで簡単に地形表現を行うことができます。
簡単に出力しただけですが、使えそう...

image.png
image.png

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

UnityでMicrosoft Cognitive Speech Servicesによる音声認識をAndroidスマホで実装する

Androidスマホで動作するUnityの3Dアプリに音声認識をさせる必要が生じたので、簡単なサンプルを作るところから始めました。音声認識には「Microsoft Cognitive Speech Services」を使うことにしました。ちょっとハマったので、備忘録も兼ねて書いておきます。

開発環境

Windows 10
Unity Ver 2019.2.17f1
Android 9.0 (Galaxy Note9)

(1)Microsoft Cognitive Speech Servicesの準備

Microsoft Azure の無料アカウントを作成

まず、Microsoft Azure の無料アカウントを作ります。ちょっと古いけど、この辺が参考になると思います。
Microsoft Azure の無料アカウントを作ってみた

Cognitive Servicesのプロジェクトを作る

Azure Cognitive ServicesのSpeech to Textで書き起こしをしてみよう」の「Cognitive Servicesのプロジェクトを作る」を参考にします。
ただし、「S0」で作っているけど、無料の「F0」がいいと思います。Nameは、これから作るプロジェクトに合わせて「csharp-unity」にしておきます。

(2) Unity 用 Speech SDKのインストール

クイック スタート:開発環境を設定する」を参考に、Unity 用 Speech SDKをダウンロードします。パッケージのインポートはプロジェクトを作ってからやるので、とりあえずダウンロードだけでOKです。

(3) Unityでプロジェクトを作成する

クイック スタート:マイクから音声を認識する」を参考にUnityのプロジェクトを作ります。

サイトの、「サンプル コードを追加する」項目の「5. YourSubscriptionKey という文字列を探し、実際の Speech サービスのサブスクリプション キーに置き換えます。」で使うキーは(1)で作ったKey1をコピーします。また、リージョンは「東日本」を選んでいれば「japaneast」になります。

プロジェクトを作ったら、上記「(2) Unity 用 Speech SDKのインストール」でダウンロードした「Speech SDK」をダブルクリックして展開し、「import」します。
image.png

(4) PCで実行確認

とりあえず、PCで実行確認すると、ちゃんとSpeech Serviceが機能して音声入力できました。
image.png

(5) Android端末で実行確認(失敗)

ここでハマりました。「connection failed (no connection to the remote host)・・・」なんてエラーが出ます。
image.png

要はこのプログラムはインターネットのアクセス許可がないようです。Androidで動かしているので、とりあえずAndroidManifestを探します。ファイル検索すると「temp」の中にありました。開いてみるとインターネット許可のパーミッションがありません。
Unity ドキュメントのAndroid マニフェストの説明」によると、「Unity は適切なマニフェストを生成しますが、そのコンテンツを直接制御したい場合もあるでしょう。Unity 以外で作成した Android マニフェストを使用するには、以下の場所にその Android マニフェストファイルを置いてください。 Assets/Plugins/Android/AndroidManifest.xml 。こうすることによって、デフォルトの Unity が作成したマニフェストをオーバーライドすることができます。」とあるので、「csharp-unity\Temp\StagingArea」の中にあったAndroidManifest.xmlをコピーして
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

を追加してみましたが駄目でした。

でも、このページを再度読むと、
「パーミッション
Unityは、Android Player 設定と、アプリケーションがスクリプトから呼び出す Unity API に基づいて、マニフェストに必要なパーミッションを自動的に加えます。以下はその例です。
・Network クラスにより INTERNET パーミッションを加えます。」
とあります。つまり、「Network クラスのメソッドをなんか使えばいいんじゃね?」ということで、HelloWorld.csの62行目あたりを次のように編集してみました。

HelloWorld.csの62行目あたり
else if (result.Reason == ResultReason.Canceled)
{
   var internet = Application.internetReachability;

   var cancellation = CancellationDetails.FromResult(result);
   newMessage = $"CANCELED: Reason={cancellation.Reason} ErrorDetails={cancellation.ErrorDetails} {internet}";
}

(6) Android端末で実行確認(成功)

今度は無事に動きました。めでたし、めでたし。

image.png

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

Animation・Animator メモ

全然知識がアップデートされてないのでメモ

■Animatorがアタッチされているゲームオブジェクトは、
 アクティブになっていると(厳密にはオブジェクトのアクティブ+Animatorスクリプトのenabled=trueのような気がする)
 自動的に再生される。

 下記のように、必ず遷移先を逃がさないとenabled=trueとenabled=false を切り替えても2回目以降のアニメーションが
 再生されない。(ちょっと調べたけどわからん)
 animationPauseState.png


できた。下記の方のようにPlayメソッドに再生位置を指定してやればいける。

XXXXX.enabled = true;
XXXXX.Play("DialogEnd",0,0.0f);

URLもう1回再生
https://spphire9.wordpress.com/2015/02/13/unityでアニメーションをもう一度再生する/

下記のアニメーター構成でも動作する。
animationReplay.png

■AnimationのLoop Timeはチェックがついているとループアニメーションになって、再生され続ける。

 ●アニメーションクリップ
  参考URL
  https://docs.unity3d.com/jp/460/Manual/class-AnimationClip.html

■スクリプトのメソッドを呼びたければ、時間の下あたりで右クリックすると
 「Add Animation Event」をクリックするとメソッドの選択プルダウンが表示されるので選ぶ。
 ボタンと違ってprivateメソッドでも呼べるっぽい

animationトリガー.png

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

Unityアニメーションが再生後すぐに終了する場合の解決方法

Unity初心者用です。

例えば攻撃アニメーションを設定してスペースボタンを押したら
攻撃してアニメーションを再生させるようにする。

しかし、アニメーションが一瞬しか動かずに終了してしまいます。

コルーチンなどを使って再生終了まで待ってもいいのですが、
簡単な方法を紹介

アニメーターのインスペクターで
アニメーションが終わった後のところ(戻る矢印)で Has Exitにチェックを
入れてExit Timeでアニメーションの終了を調節します。

Unityのはじめの頃ってanimatorの使い方なんかがわからないんですが、
いろいろ試しているうちにすこしづつわかるようになってきました

animationHasExitTime.png

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