(:3[kanのメモ帳]

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

(:3[kanのメモ帳]

コンポーネントの設定値をアセットとして保存&反映したり、初期値を変えたりする Preset【Unity】

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


はじめに

Unityはコンポーネントの設定値をコピペする事が出来ます。

f:id:kan_kikuchi:20191019075435j:plain


ただ、このコピべの頻度が多くなると結構手間ですし、

そもそもコンポーネントの設定値の初期値を変更したいという事もある。


そこで使えるのが今回紹介するPresetという機能です。

f:id:kan_kikuchi:20191019080941g:plain


ちなみにPresetはUnity 2018.1から追加されたようです。


Presetとは

続きを読む

Steamの実績をUnityで実装する【Unity】【Steam】

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


はじめに

今回はUnityで作ったゲームに、Steamの実績を実装する方法の解説です!

f:id:kan_kikuchi:20191012091400g:plain


ちなみにVRゲームでも全く同じ方法で実装可能です。

なお、Steamworksへの登録が済んでいる前提ですので、あしからず。


目次

  • はじめに
  • 目次
  • 導入
  • Steam(ブラウザ)上での設定
    • データ設定
    • 実績設定
  • 実装
    • 初期化
    • データ設定
    • データ取得
    • 実績解除
    • データと実績のリセット
  • 参考


導入

続きを読む

Steam向けアプリを申請した際にYour build has failed our review because your app appears to include sexually explicit content involving minors とリジェクトされた時の対処法【Steam】【リジェクト】

はじめに

以前、札束風呂VRというVRゲームをSteamでリリースしたのですが、



その申請時に

Your build has failed our review because your app appears to include sexually explicit content involving minors.

という内容でリジェクトされたので、


f:id:kan_kikuchi:20191008053832j:plain


今回はそれをどう解決したかという記事です。


リジェクト全文と解決方法

続きを読む

Steam向けアプリを申請した際にYour build has failed our review because it does not launch using the Steam client とリジェクトされた時の対処法【Steam】【リジェクト】

はじめに

以前、札束風呂VRというVRゲームをSteamでリリースしたのですが、



その申請時に

Your build has failed our review because it does not launch using the Steam client.

という内容でリジェクトされたので、


f:id:kan_kikuchi:20191008053832j:plain


今回はそれをどう解決したかという記事です。


リジェクト全文と解決方法

続きを読む

Addressable Assetsのアドレスの重複を検知する【Unity】【Addressable Assets】【エディタ拡張】


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


はじめに

Addressable Assetsのアドレスはファイル名とは別に自由に設定できますが、

なんと同じアドレスを設定する事が出来てしまいます。

f:id:kan_kikuchi:20191004094933j:plain


しかも設定時、ロード時共にエラーも出ないので、

気付かず重複していて、思ったのと違うのをロードしていたなんて事にもなりかねません。

using UnityEngine;
using UnityEngine.AddressableAssets;//Addressablesを使うのに必要

public class NewBehaviourScript : MonoBehaviour {

  private void Start () {
    //AlchemistというAddress(3件重複している)のSpriteを非同期でロード
    Addressables.LoadAssetAsync<Sprite>("Alchemist").Completed +=  op => { 
      //ロード結果をログで確認
      Debug.Log(op.Result.name);
    };
  }
	
}
f:id:kan_kikuchi:20191002112503j:plain


という事で、Addressable Assetsのアドレスの重複を検知するエディタ拡張を作ってみました!

f:id:kan_kikuchi:20191004101449g:plain


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





AddressDuplicateDetecter

続きを読む

外部からは値が参照出来ない形に実装されている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を分ける

続きを読む