(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

外部からは値が参照出来ない形に実装されているScriptableObject等の内容を無理やり取得する【Unity】【ScriptableObject】【エディタ拡張】【C#】

この記事でのバージョン
Unity 2018.4.8f1


はじめに

アセットストアのアセットや外部SDKなどをUnityで使う際、

ScriptableObjectが使われてる事はよくあります。


そしてそのScriptableObjectの値を使いたいのに、

外部からは取得出来ない形に実装されているという場合は少なくありません。


という事で今回はScriptableObjectの内容をで無理やり取得する方法を3パターンほど紹介する記事です!

なお、ScriptableObject以外のアセットやプログラムに使えるものもあります。

f:id:kan_kikuchi:20190924051920j:plain


なお、どのパターンでも以下のような

privateなフィールドのみを持ったScriptableObjectを例に使っています。

using UnityEngine;

/// <summary>
/// サンプル用のScriptableObject
/// </summary>
public class SampleScriptableObject : ScriptableObject {
 
  //外部から取得できない文字列
  [SerializeField]
  private string _text = "SampleText";
   
  //外部から取得できない数字
  [SerializeField]
  private int _num = 58;
 
}
f:id:kan_kikuchi:20190930051907j:plain



Reflection

続きを読む

Addressable Assetsのアドレスとラベルを管理する定数クラスを自動生成する【Unity】【Addressable Assets】【エディタ拡張】


この記事でのバージョン
Unity 2018.4.8f1
Addressables 1.2.4


はじめに

Addressable Assets System(AAS)はアセットのロード時にアドレス(文字列)を用います。

一応、AssetReference等を使って、文字列を使わない使用しない方法もありますが、

f:id:kan_kikuchi:20190925055148j:plain


場合によってはアドレスで指定したい場合もあります。

そんな時に、アドレスを直接入力してしまうと打ち間違いが発生してしまうかもしれませんし、

アドレスの変更への対応もしにくいです。


という事で今回は、アドレスを(とついでにラベルも)管理する定数クラスを自動作成してみました。


イメージとしては以下のようなアドレスの定数が列挙された定数クラスを自動で作成&更新し、

手入力をなくすと言った感じ。

f:id:kan_kikuchi:20190929050255j:plain
//定数クラスを使って、Keyを指定してロード
 Addressables.LoadAssetAsync<GameObject>(AddressableAssetAddress.CAMERA).Completed +=  op => { 
  Debug.Log(op.Result.name);
};


ちなみに、以前Resourcesでも同じようなものを作っていました。





AddressableAssetAddressClassCreator

続きを読む

ResourcesのシンプルさとAssetBundleの自由度を実現したAddressable Assetsとは(脱Preview記念リライト)【Unity】【Addressable Assets】

この記事でのバージョン
Unity 2018.4.8f1
Addressables 1.2.3


はじめに

Unityの鬼門の一つに「画像や音源等のリソースをどう管理するか」というものがあります。

「Resources使えば良いじゃないの?」と思う方もいるかもしれませんが、

実は公式で「Resourcesフォルダのベストプラクティスは使用しない事である」

なんて言われるぐらい推奨されていません。



じゃあ何を使えばいいのかと言えばAssetBundleなのですが、

「AssetBundleって難しいし、面倒くさいし、出来れば使いたくない!!」

というのが大方の意見かと思います。


それでもなくなくAssetBundleを使っていましたが、そんな現状を打破するために

なんとAddressable Assets System(通称AAS)というリソース管理の新システム

Unity2018.2から使えるようになりました!

そしてそのAddressable Assetsを使ってみようという感じの記事を以前書きました。



この時から基本的な使い方は変わっていないのですが、

メソッド名が変わったり、Previewが外れて正式版(?)になったりしたので、新しく書き直して見ました!


なお、記事中の画像は以下のアセットを使っております。





目次

  • はじめに
  • 目次
  • Addressable Assetsとは
  • 導入
  • 設定
  • 単体ロード
  • 複数同時ロード
  • インスタンスの生成と破棄
  • 事前ロード
  • 文字列(AddressやLabel)の直接入力を避ける
  • AssetReferenceに設定出来るタイプを制限
  • グループ(アセットのパッキング設定)
  • プロファイル(開発中とリリース時で設定を変える)
  • ResourcesやAssetBundleからの移行
  • Play Mode(エディター上でのAddressable Assetsの動作を変更)
  • RM Profiler(アセットのロード状態の可視化)
  • おわりに


Addressable Assetsとは

続きを読む

SteamVR Pluginを導入したらHmd Not Found Presence Failedとエラーが出る時の対処法 【Unity】【Steam】【VR】【トラブルシューティング】

この記事でのバージョン
Unity 2018.4.6f1
Steam VR Plugin 2.3.2 (sdk 1.4.18)


はじめに

以前、Steam向けのVRゲーム開発の導入的な記事でも書きましたが、

f:id:kan_kikuchi:20190114181924g:plain:w800


UnityでSteam向けのVRゲームを開発する際は、SteamVR Pluginというアセットを使うのが一般的です。



ただ、このアセットを導入すると何もないシーンでも、以下のようなエラーが出る事があります。

XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFoundPresenceFailed: "Hmd Not Found Presence Failed (126)"!

f:id:kan_kikuchi:20190913053301j:plain


今回はこんな場合の対処法です!


Hmd Not Found

続きを読む

uGUIの負荷を減らす、7つの最適化【Unity】【uGUI】【最適化】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

公式でUnityのお役立ち情報を配信しているUnity for Proというサイトがあるのですが、

(ライセンスのProではなく、実務で使えるという意味でのPro)

f:id:kan_kikuchi:20190914061149j:plain


その中の「Unity UI の最適化に関するヒント」といういかにも重要そうな記事があったので、



今回は勉強がてら、この記事を自分なりにまとめ直してみました!


目次

  • はじめに
  • 目次
  • 1. 頻繁に動くものはCanvasを分ける
  • 2. 無駄なRaycastをなくす
  • 3. Camera.mainに何度もアクセスしない
  • 4. Layout Group(Scroll Rect)を使わない
  • 5. オブジェクトプール時の処理の順番に気を付ける
  • 6. Canvasを非表示にする時はコンポーネントを無効にする
  • 7. 変更がないAnimator(Animation)は使わない
  • おわりに


1. 頻繁に動くものはCanvasを分ける

続きを読む

Hierarchy上で選択しているGameObjectを固定する【Unity】【エディタ拡張】


この記事でのバージョン
Unity 2018.4.6f1


はじめに

今回はHierarchy上で選択しているGameObjectを固定する

言い換えると、一つのオブジェクト以外選択できないようにするというトリッキーな話です。


イメージとしては以下のような感じ。

f:id:kan_kikuchi:20190817045105g:plain


なお、Inspectorの表示を固定したいだけなら、右上のロック機能を使った方が早いです。

f:id:kan_kikuchi:20190817045147j:plain



SelectedGameObjectFixer

続きを読む

可変する数字を画像(Sprite)を使って、SpriteRendererやImageで表示【Unity】【uGUI】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityで数字を表示する時はuGUIのTextを使うのが一般的ですが、

「フォントを使わずに可変する数字を画像で表示したい!」

「SpriteRendererで可変する数字を表示したい!」みたいな事がたまにあります。


という事で今回はフォントを使わず、以下のような数字の画像(Sprite)を使って

f:id:kan_kikuchi:20190912073536j:plain


SpriteRendererやImageで任意の数字を表示するプログラムの紹介です!

f:id:kan_kikuchi:20190912075702g:plain


なお、記事中の例では数字の画像をバラバラの状態で使っていますが、

実際に使用する際はSpriteAtlasなどでまとめる事をオススメします。(負荷が下がるので)





SpriteNo

続きを読む

サーバーサイド不要&無料でゲーム内のデータをリモートで変更出来るUnity公式の機能 Remote Config 【Unity】【Unity Services】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

以前、ブラウザ上で設定したデータを、プログラムで簡単に取得出来る

Remote SettingsというUnityサービスの機能を紹介したのですが、

f:id:kan_kikuchi:20190827062021g:plain


その際に同系統のRemote Configという機能(やっぱり無料!)を教えてもらったので、

今回はそれを試してみた感じの記事です!



イメージとしては以下のような感じで、Remote Settingsと同じような事が出来ます

Remote Settingsと違い、ブラウザでの操作が必要なく、Unityエディタ上で完結するみたいでした。

f:id:kan_kikuchi:20190908045625g:plain


なお、Unity Remote Configを使えるのは、Unity2018.3以降です。

また、プレビュー版なので、今後大きな変更が加わる可能性がある点には注意が必要です。


導入

続きを読む

ScriptableObjectなどのアセットを、metaファイルを変更せずに上書きする 【Unity】【エディタ拡張】


この記事でのバージョン
Unity 2018.4.6f1


はじめに

UnityではAssetDatabaseのCreateAssetを使うことで、アセットを簡単に生成する事が出来ます。

//ScriptableObjectChildというScriptableObjectを作成
var child = ScriptableObject.CreateInstance<ScriptableObjectChild> ();

//ScriptableObjectをアセットとして生成
string exportPath = "Assets/ScriptableObjects/Chid.asset";
AssetDatabase.CreateAsset(child, exportPath);

Debug.Log(exportPath + "生成");
f:id:kan_kikuchi:20190901075412j:plain


このCreateAsset、もし生成先に既にアセットがある場合は上書きで保存するのですが、

その際に当然ですがmetaファイルも上書きされます。


基本的にはそれで問題ないのですが、以下のようにどこかで参照されているものを上書きしてしまうと

参照がなくなってMissingと表示されるようになってしまいます。

///ScriptableObjectChildを参照しているScriptableObject
public class ScriptableObjectParent : ScriptableObject {
  
  [SerializeField]
  private ScriptableObjectChild _child = null;
  
}
f:id:kan_kikuchi:20190901092349g:plain


参照を維持したままファイルを更新したい場合は、metaファイルをそのままにすればいいのですが、

残念ならがらUnityにはそういう機能がないようです。(もしある場合はご一報頂けると幸いです……!)


という事で今回は

ScriptableObjectなどをmetaファイルを変更せずに上書きする処理を作ってみました!


CreateAssetWithOverwrite

続きを読む

サーバーサイド不要&無料でゲーム内のデータをリモートで変更出来るUnity公式の機能 Remote Settings【Unity】【Unity Services】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityはエディタだけでなく、Unity AdsUnity Analyticsなどの




便利なサービスをUnity Servicesという形で提供しています。

Unity は、ゲーム開発はもとより、オーディエンスをひきつけ、維持し、収益につなげるさまざまな無料サービスを提供しています。


そんなUnity Servicesの中(のUnity Analyticsの中)にRemote Settingsというサービスがある事を

以下の動画で知ったので、試してみて、導入や使い方をまとめてみました!



イメージとしては以下のような感じで、

ブラウザ上で設定したデータを、プログラムで簡単に取得出来るといったもの。

f:id:kan_kikuchi:20190827062021g:plain


もちろん、サーバーサイドの準備や実装は必要ありませんし、

無料で使う事が出来ます!(これ以上使ったら有料みたいなのもなし)


残念ながらゲーム側からデータを送る事は出来ませんが、それでも

ゲームバランスに関わる値の調整、ゲーム内イベントのデータやフラグ管理、広告の配信比率

など、様々な用途に使えるので、覚えておいて損はないと思います。


導入(ブラウザ編)

続きを読む