FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »C#
このページの記事一覧

【Unity】【C#】ゲームパッドの右スティックを使えるようにする  


 基本的にはこちらの資料そのままという感じだが、もっとざっくりと視覚的に見たいときの自分用メモ。なので詳しく知りたいときは以下のURLを参照して欲しい。まぁ、内容的に難しくはないのだが、実は「ゲームパッドの機器によって設定が異なる」という問題があることを知ったので、コードより手順の方を簡単に書いておこうかと。

Unityでゲーム開発 -左右スティックを使う方法-

(※) Unity 2019.2.21f1 / Windows10(x64) で確認



■InputManager で右スティック用設定を作っておく

 まずは、メニューから「Edit>Project Settings...」を開き、左のタブから「Input」を選択する。

 そしたら、一番上の「Size」を+2個し、右スティック用の設定を作る(※水平・垂直2方向の場合)。

 名前「Name」はコードで使うので、自分でわかりやすい名前を付けておく

 ここでは「Axis」の項目で「4th axis(Joystick)」「5th axis(Joystick)」を選択しているが、ここが前述した「機器によって違う」項目であり、ランタイム時にユーザーに設定して貰うしかないので、とりあえず開発テスト用の機器に合わせたもので良い(わからなければ、この設定でも良い。※ここでは「Logicool Rumble Gamepad F510」を使用例に用いている)。

 注意点としては「Invert」(値の正負反転)はオフにしておいた方が良いだろう。これもゲームパッド機器によって違うので、アプリ内で設定できるようにしておく必要がある





■右スティックをコードで取得する

 先ほど InputManager で付けた名前を使って、コードから入力値を取得する。取得できる値の範囲は -1~0~+1 だ。「Invert」がオンになっている場合は、正負が反転する。ここでは InputManager での「Invert」はオフであるとして、アプリ内にユーザーが設定できる UI などを置いて、それがオン・オフできると仮定しておこう(UI-Toggle.isOn 等が簡単)。そしてそれらをプロパティで表わすとする。尚、私は「Logicool Rumble Gamepad F510」という機器を使ってテストしているので、それに合わせてデフォルト値を設定しているが、開発環境によって任意で良い。

●右スティックの入力を取得する例(※ .NET 4.x 以降)
using UnityEngine;

//反転オプションプロパティ (※Logicool Rumble Gamepad F510 でのデフォ例。任意で良い)
bool InvertH { get; set; } = false; //水平方向反転オプション (UI などでユーザー設定できるようにしておく)
bool InvertV { get; set; } = true; //垂直方向反転オプション (UI などでユーザー設定できるようにしておく)

//右スティックの入力による方向の取得
float h = Input.GetAxis("HorizontalStickR"); //水平方向 ※InputManager で付けた名前
float v = Input.GetAxis("VerticalStickR"); //垂直方向 ※InputManager で付けた名前
Vector2 dir = new Vector2(h * (InvertH ? 1 : -1), v * (InvertV ? 1 : -1));

//方向による処理など・・・
Debug.Log($"h = {h}, v = {v}, dir = {dir}");

 もちろん、Input.GetAxis() の代わりに Input.GetAxisRaw() を用いても良い。その場合は中間値がなく、値が -1, 0, +1 のいずれかになる(つまり量がなく、方向だけ取得する感じになる)。



■アプリ起動前のダイアログで右スティックを設定する

 なんからのテストできるものを作ったら、アプリをビルドしてみよう。

 右スティックを設定するには、起動時に出るダイアログで「Input」タブに切り替え、InputManager で付けた名前をダブルクリックする。そしたら「Input Configuration」の小さなボックスが出るので、このときに、右スティックを利用する方向へ倒せば登録される(表示も変わる)。この操作をユーザーにやって貰う必要がある(なので、説明書とか必要だよね…)。

 登録完了したら、「Play!」してアプリ内で確認してみよう。

●名前をダブルクリックすると、「Input Configuration」ボックスが出る


●右スティックをそれぞれ利用する方向へ倒すと(上or下/左or右)登録される


 尚「Input Configuration」で設定した値は、レジストリ(Windows)で「__Input Joystick Axis HorizontalStickR_~」のように記録されているようだ(axis3 なら値は3 のように)。なので、一度設定したら、毎回設定する必要なく、継続して使える。





(関連記事)
【Unity】【C#】CapsLock のオン・オフ状態を取得する (Windows)
【Unity】5ボタンマウスの KeyCode 図解
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする
【Unity】【C#】長押し(ロングタップ)を取得してコールバックする
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  C# 
tb: 0   cm: --

【Unity】【C#】CapsLock のオン・オフ状態を取得する (Windows)  


 Unity には Input クラスという入力に関するクラスが元からあるが、残念ながら「Input.GetKey(KeyCode.CapsLock)」のようにして、CapsLock の状態を取得するのは上手く行かなかった(押下した瞬間の判定なので、常に true になる)。

 また、OnGUI() での Event.capsLock というものもあるが(Update() などでは使えない=エラーが出る)、こちらも同じように押下した瞬間に true になるだけで、「オン/オフの継続している状態」が取得できない。

 なのでいつものようにググってたら、Windows API から取得する方法があったので、試してみた。しかし同時に利用するにあたって、いくつか注意する点もあったので、備忘録として残しておこう。

(※) Unity 2019.2.21f1 / Windows10(x64) で確認

 まずは Windows API から状態を取得するメソッドを static で定義しよう。以下のコードは参考資料の内容を、使い回せるように少しだけ手を加えたものだ。.NET 4.x 以降のコードになっているので注意して欲しい(.NET 3.x にしたいなら「=>」などを通常のメソッドに書き直せば使える)。

(参考)
Capslock detection ?

●Windows API から CapsLock の状態を取得する
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
using System.Runtime.InteropServices;

public static class WindowsUtil //※名前は任意
{
//https://forum.unity.com/threads/capslock-detection.538792/
[DllImport("user32.dll")]
public static extern short GetKeyState(int keyCode);

//CapsLock の状態取得
public static bool IsCapsLockOn
=> (((ushort)GetKeyState(0x14)) & 0xffff) != 0; //※.NET 4.x
}
#endif

 あとは参考資料と同じように、起動時にプロパティにでも入れておいて、キー入力のたびに反転するのが良いだろう。毎フレーム API 使うのは負荷が高そうだしね(常に型変換の必要があるので)。ここまではほとんど参考資料と同じだ。

 メインは例えば、以下のようなコードで確認できるだろう(何かキーを押したときに CapsLock のオン・オフ状態が取得できる)。

●メインでの使用例
using UnityEngine;

bool IsCapsLockOn { get; set; }

private void Awake()
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
IsCapsLockOn = WindowsUtil.IsCapsLockOn; //Windows API を定義したクラス
#endif
}

private void Update()
{
if (Input.anyKeyDown)
{
if (Input.GetKeyDown(KeyCode.CapsLock))
{
IsCapsLockOn = !IsCapsLockOn;
}

Debug.Log($"IsCapsLockOn = {IsCapsLockOn}"); //※.NET 4.x
}
}

 ただこれには1つ注意点があって、「アプリから離れる → 他のアプリ上などで CapsLock を切り替える → アプリに戻る」などの操作をすると、IsCapsLock のプロパティが狂ってしまう。なので、再度アプリにフォーカスが当たったときや、アプリのポーズ復帰(Resume)のようなタイミングで再度 Windows API から取得した方が良いようだ。

●フォーカスやレジュームのタイミングで再取得例
・・・(中略 ※前述のコード)・・・
private void OnApplicationFocus(bool focus)
{
if (focus)
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
IsCapsLockOn = WindowsUtil.IsCapsLockOn;
#endif
}
}

private void OnApplicationPause(bool pause)
{
if (!pause) //Resume
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
IsCapsLockOn = WindowsUtil.IsCapsLockOn;
#endif
}
}

 しかし、実はまだこれでも上手く行かないときがある。何度か試してみたら、どうやら OnApplicationFocus 等と同フレームで取得すると、不正確になるようだ。なので1フレーム遅らせて取得するなどの工夫も必要になる(エディタ上では上手く行くかも知れないが、ランタイム時にはタイミングによって上手く行かないことがある=Unity ではよくある事なので覚えておくと良い)。

 1フレーム遅らせて処理する方法は色々あるので、好きにやって欲しい。コルーチンでも良いし、.NET 4.x なら async/await でも良いだろう。UniRx プラグイン使っているなら Observable.NextFrame() を使うのも良いね。以下に例を載せておくので、既存のコードとの兼ね合いで実装すると良いだろう。

●コルーチン例
・・・(中略)・・・
private IEnumerator OnApplicationFocus(bool focus)
{
if (focus)
{
yield return null;
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
IsCapsLockOn = WindowsUtil.IsCapsLockOn;
#endif
}
}

//OnApplicationPause も同様


●UniRx, UniTask / async, await 例
【Unity】【UniRx】時間系のオペレータまとめ
【Unity】【C#】UniRx で「1フレームごと待機して処理」してみる





(関連記事)
【Unity】【C#】UniRx で「1フレームごと待機して処理」してみる
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】5ボタンマウスの KeyCode 図解
【Unity】【C#】ゲームパッドの右スティックを使えるようにする


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  WindowsAPI  C# 
tb: 0   cm: --

【Unity】【C#】文字列の暗号化・復号化を簡単に行う  


 今回は手軽にデータの暗号化・復号化が行える「Unity Cipher」というオープンソースライブラリを紹介しよう。

 実際にはコードを見てみると、特に Unity 以外でも使えそうだが、デモ(Examples)が Unity で作られているからだろうか?とても簡単で強固なセキュリティが確保できるので、パスワードや何らかのアカウントデータなどを扱うアプリなら、導入を検討した方が良いだろう。

 詳しい内容などはライブラリ作者直々の記事があるので、そちらを参考にして欲しい。ここではどちらかと言うとオープンソースライブラリなど、余りサードパーティを利用したことのない人のためにも、細かい導入手順を書いておく。

Unity(C#) で「正しい」暗号化処理をするライブラリを作成しました

(※) Unity 2019.2.18f1 / Windows10(x64) で確認

※掲載時点 1.2.0 では 2019.2.17f1 で作られているようだが、コードにバージョン依存性はあまり無いと思うので、少し古い Unity バージョンでも問題なく使えると思う(少なくとも Unity2017 では使えた)。


■ライブラリのインポート

 まずは github でライブラリをダウンロードしよう。「Clone or download」から zip をダウンロードできるので、落としたら解凍して、「UnityCipher.unitypackage」を Unity にインポートする(プロジェクトビューにドラッグ&ドロップすると楽)。



Unity CipherMIT License



 インポートできたら、「Assets/UnityCipher/Plugins/UnityCipher/」フォルダにある cs ファイルがライブラリ本体となる。
 デモ(Assets/UnityCipher/Examples/ 以下)が必要無いなら、これらファイルだけ導入しても構わない。



 ちなみに「Plugins」フォルダに入れておくことは、スクリプトのコンパイル順に関係する事なので、汎用的なライブラリは Plugins 以下に配置されていることが多い → UniRxAssetStore版)等

特殊フォルダーとスクリプトのコンパイル順 (Unity Manual)

 簡単な使い方はデモを見るのが早いかも知れない。「Assets/UnityCipher/Examples/ 」に「Example」シーンがあるので、起動してみると良いだろう。



 オススメは「Rijndael」だ。サンプルコード上では「Examples/Scripts」フォルダ以下の「RijndaelContent.cs」を開けば、だいたい使い方がわかると思う。例えば、暗号化・復号化の部分を抜き出せば次のようになる。

●UnityCipher での暗号化・復号化
using UnityCipher;

//暗号化
string encrypted = RijndaelEncryption.Encrypt(planeText, passwordText);

//復号化
string plane = RijndaelEncryption.Decrypt(encryptedText, passwordText);

(例えば、planeText = "hogehoge", passwordText = "password" とすると)
encrypted = I8WWDJbFzGCN4OiauU7H1w2PSOTCFDZUIMXD000pA3bq4T4g06lNvzxSlW8qQEMF4agkUfrnFfL4eXRd9AtaSlI2TZpuwZF7dH1+sYwaNBvOty2ImJJuaqVWEdWbjfB6

(次に、暗号化[エンコード]された文字列(encrypted)を復号化すると[→ passwordText は同じものを使う])
plane = "hogehoge"

 このライブラリの優れた所は、デモでもう一度同じ文字列を暗号化して貰えるとわかると思うが、毎回違う文字列が生成される点だ(ライブラリ作者の記事に詳しく書いてある)。つまり文字列の並びから中身は想定はされずらいので、セキュリティ的にも安全性が高くなる(世の中には本当に凄い人もいるもので、実際に学会などで新しい暗号化方式を、何度かパターンを見ただけでやぶってしまう人もいるという…)。

 また注意点としては、当たり前だがパスワードは難しいものにしておいてね…と(笑)("password" とか "admin" とかはダメですよ(笑))。

 Unity においては例えば PlayerPrefs に使っても良いかも知れない。ただし、文字列が長くなるので、Android/iOS には大量にやらない方が良いかも(Android は ~.xml, iOS は ~.plist に書き出されるため)。もしキーと値を両方暗号化したいなら、キーには「ハッシュ値」を使うのもアリだろう。

【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表

 また、github の Usage にも書いてあるが、byte[] も使えるので、バイナリデータを暗号化するにも良いだろう。使い方は同様なので難しくはないと思う。





(関連記事)
【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
【C#】GUID の生成と書式
【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityプラグイン  Unityオープンソースライブラリ  C# 
tb: 0   cm: --

【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧  


 以前「Windows日本語キーボードでのKeyCodeにはバグがある」みたいな記事を見たことがあったが、Unity4 時代の頃からなので、単純にキーボードによる違いと考えて、改めて確認した。特に記号の KeyCode が公式マニュアルとは少し違うので、簡単な一覧表としてまとめてみた。

[Unity]KeyCodeについて


(※) Unity 2018.4.4f1 / Windows10 (x64) で確認



■Windows 日本語キーボードでの記号の KeyCode 一覧

 基本的には公式マニュアルで十分なので、ここでは記号のみで、日本語キーボードでは見た目が違うものがわかるように挙げておこう。ショートカットキーみたいなものを作るときに、ちょっと困ったりするんだよね(笑)。

KeyCode(公式マニュアル)

●Windows 日本語キーボードでの記号の KeyCode 一覧

キーKeyCode備考
-Minus 
^Quoteキャレット
Backslash右[Shift]隣の[\_ろ]と同じになる。
[LeftBracket 
]RightBracket 
@BackQuoteアットマーク
;Equalsセミコロン
:Semicolonコロン
,Commaカンマ(コンマ)
.Periodピリオド(ドット, ポイント)
/Slashスラッシュ
Backslashバックスラッシュ。[Backspace]隣の[¥|]と同じになる。
ClearDeleteテンキー[Clear]。[Delete]と同じになる。
PrtScnSysReqPrint Screen
MenuMenu右[Ctrl]隣のメニューキー
WindowsキーLeftCommandWindowsアイコンのキー

※[Shift]キーを押さない状態。
※テンキー(Keypad~)は公式マニュアルとほぼ変わらないので割愛([Clear]のみ)。



■KeyCode をリアルタイムで調べるコード

●KeyCode をリアルタイムで調べる
using System;
using UnityEngine;

public class KeycodeTest : MonoBehaviour { //※クラス名は任意

Array keyCodes = Enum.GetValues(typeof(KeyCode));

// Update is called once per frame
private void Update () {
if (Input.anyKeyDown) //※KeyDown のみ
{
foreach (KeyCode key in keyCodes)
{
if (Input.GetKeyDown(key))
{
Debug.Log(key);
}
}
}
}
}

 内容的には KeyCode の列挙型の一覧(※Array 型)を何らかのキーが押された時(Input.anyKeyDown)に調べているだけだ。ここでは KeyDown (押下した瞬間)を使っているので、押してる間ずっとにしたいなら Input.GetKey を使っても良いだろう。

 Unity の場合、記号は使っているキーボードによって値が変わる可能性があるから(Mac 上では大丈夫と記事にあるが)、あまり使わない方が良いのかもね(笑)。

Array Class
Enum.GetValues(Type) Method
Input.anyKeyDown
Input.GetKey





(関連記事)
【Unity】5ボタンマウスの KeyCode 図解
【Unity】【C#】ゲームパッドの右スティックを使えるようにする
【C#】【Unity】enum 型と string, int 型の相互変換など


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  C#  一覧 
tb: 0   cm: --

【Unity】【C#】Addressable Assets でキー(アドレス)の存在(登録)を調べる  


 新しいリソースの管理のシステムである Addressable Assets をちょっといじってみた。しかしなぜか、素材のアドレス(キー)が存在しないときに出る InvalidKeyException が try~catch で捕捉できないので、登録の有無の検出ができなかった…(掲載時点:Addressables System 0.5.3-preview)。


InvalidKeyException encounterd in operation UnityEngine.ResourceManagement.CompletedOperation`1[UnityEngine.Texture], result='', status='None', valid=True, location=..
UnityEngine.AsyncOperation:InvokeCompletionEvent()

InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown., Key=hogehoge
UnityEngine.AsyncOperation:InvokeCompletionEvent()

 まだ preview 版なので、単なるバグなのかも知れないが、少し不便と感じたのでググってみたら、フォーラムにも同じ内容があった。

Can I ask Addressables if a specified key (addressable name) is valid?

 まぁそのうち、ちゃんとエラー捕捉できるようになったり、「Addressables.HasKey()」みたいなのができそうな気がするが、今使うには簡単なものを用意しておくのも良いだろう。



(※) Unity 2018.3.2f1 / Addressables System 0.5.3-preview / Windows10(x64) で確認



■Addressable Assets にアドレス(キー)が存在するか否か?を返すメソッドを定義

 フォーラムにある「AddressableResourceExists」でも判別可能ではあったが、そのすぐ下に Unity の中の人からのアドバイスが書かれていたので、試しにやってみた。

What you have above probably could work. But the thing I would actually recommend is to just do Addressables.LoadAsset<IResourceLocation>("key");

This will not load your asset, but will load the location that points to your asset. If your key is valid, then you'll get a valid location back. Otherwise you will not. You can keep and use that location (doing LoadAsset<GameObject>(myNewLocation)) or you can just discard it and continue to load with key once needed.

 Google翻訳すれば『これはアセットをロードするのではなく、アセットを指す場所をロードします。キーが有効であれば、有効な場所に戻ります』となるが、要するに「存在位置が示されればアセットは存在する」ということだろう。

●Addressable Assets にアドレス(キー)が存在するか否か?
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;

public static class AddressablesUtil { //※クラス名は任意

// (参考) https://forum.unity.com/threads/can-i-ask-addressables-if-a-specified-key-addressable-name-is-valid.574033/
// http://fantom1x.blog130.fc2.com/blog-entry-319.html
/// <summary>
/// Addressable Assets にアドレス(キー)が存在するか否か?
/// </summary>
/// <param name="key">アドレス(キー)</param>
/// <returns>true = 存在する / false = 存在しない</returns>
public static bool Exists(string key)
{
return Addressables.LoadAsset<IResourceLocation>(key).Status == AsyncOperationStatus.Succeeded;
}
}

 やってみたら、どうやら存在しないキー(アドレス)を指定したときには「AsyncOperationStatus.Failed」になるみたいなので(まだ何もしてないときは None)、これだけで存在有無は確認できそうだ。Addressables.LoadAsset() の戻値:IAsyncOperation<IResourceLocation> は null は出ないみたいなので、チェックは省略した。

 使用例を簡単に書くと以下のようになる。

●Exists() の使用例(Addressable Assets からテクスチャを読み込んで RawImage に入れるサンプル)
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;

public class AddressablesTest : MonoBehaviour { //※クラス名は任意

public RawImage image;

void Start () {
string key = "hogehoge"; //アセットのアドレス(キー) ※任意

if (AddressablesUtil.Exists(key))
{
Addressables.LoadAsset<Texture>(key).Completed += op => {
image.texture = op.Result;
};
}
else
{
Debug.LogWarning("Invalid key = " + key);
}
}
}




■Task と連携して非同期で読み込むメソッドを定義

 ついでに前述した「Exists」と以下の拡張メソッドを組み合わせて、動作を Task 化し、アドレスの存在検出して、有れば素材を、無ければ default(この場合は基本的に null)が返ってくる関数を定義してみよう。これを使うとかなり楽に非同期ロードができるようになる。Task 化メソッドは以下の記事(IAsyncOperationExtensions.GetAwaiter<T>)をまるっとコピーして欲しい。
 
【Unity】Addressable Asset Systemのリソース読み込みをasync/await対応する

●アドレス(キー)が存在するならロードし、無ければ default (= null) を返す
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;
using System.Threading.Tasks; //※Task ならこっち
//using UniRx.Async; //※UniTask ならこっち

public static class AddressablesUtil { //※クラス名は任意

// (参考) https://qiita.com/toRisouP/items/e03b53e8eb6af06fbcbf (※IAsyncOperationExtensions.GetAwaiter<T> を利用)
// http://fantom1x.blog130.fc2.com/blog-entry-319.html
/// <summary>
/// アドレス(キー)が存在するならロードし、無ければ default (= null) を返す
/// </summary>
/// <typeparam name="T">素材の型</typeparam>
/// <param name="key">アドレス(キー)</param>
/// <returns>取得した素材</returns>
public static async Task<T> LoadOrDefault<T>(string key) where T : class
{
if (Exists(key)) //※前述のメソッド
return await Addressables.LoadAsset<T>(key); //※IAsyncOperationExtensions.GetAwaiter<T> が必要
return default;
}
}

 もちろん、Task を UniTask(UniRx が必要)に置き換えることも可能だ。

 簡単な使い方としては以下のようにしても良いだろう(※かなり適当なので、好きに書き換えて(笑))。

●LoadOrDefault()の使用例(Addressable Assets からテクスチャを読み込んで RawImage に入れるサンプル)
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;
using System.Threading.Tasks; //※Task ならこっち
//using UniRx.Async; //※UniTask ならこっち

public class AddressablesTest : MonoBehaviour {

public RawImage image;

void Start () {
string key = "hogehoge"; //アセットのアドレス(キー) ※任意
LoadImage(key); //※Task なら警告が出る
//LoadImage(key).Forget(); //※UniTask なら警告を消せる
}

async Task LoadImage(string key)
{
var tex = await AddressablesUtil.LoadOrDefault<Texture>(key);
if (tex != null)
{
image.texture = tex;
}
else
{
Debug.LogWarning("Invalid key = " + key);
}
}

}

 もちろんこれも UniTask(UniRx が必要)に置き換えても良い。

 待機したいなら、async/await を付ければ良い(※この例ではあまり意味がないが(笑))。
async void Start () {
string key = "hogehoge"; //アセットのアドレス(キー) ※任意
await LoadImage(key);
}



 まだ、Addressable Assets はプレビュー版だからか、使い勝手が微妙な所もあるが、いずれは Resources の代わりに使われるようになるだろう。Addressable Assets ははじめから非同期ロードだったり、プリロード機能もあったりして便利なので、今から慣れておくのも良いかも知れない。





(関連記事)
【Unity】【C#】AssetBundleManager を WebGL で使う・エラー対処法
【Unity】【C#】アセットバンドルのキャッシュを調べて不要なものを消す


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityトラブルシューティング  C# 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR