質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

Addressables.LoadAssetAsyncが実行されない。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

229閲覧

投稿2022/01/27 10:03

前提・実現したいこと

Unityのエディタ拡張として、Tilemapをファイルに書き込まれた情報を基に生成する処理を作っています。「該当のソースコード」に記載したGenerateTile()関数をボタン押下で同一クラス内から呼び出しています。ファイルの全文は字数超過で記載できませんでした。

発生している問題・エラーメッセージ

「該当のソースコード」の後半にある、Addressables.LoadAssetAsync<TileBase>(tileLayout[a,b,c]) += op => {(省略)}が実行されていないと思われます。
直前のDebug.Log("a");は問題無く実行されますが、ラムダ式(?)内のDebug.Log(op.Result);は実行されません。
何か分かる方は教えて戴けると幸いです。

該当のソースコード

EventFunction.TILEMAP_MAXRANGE_X(Y)はただの定数、中身は100です。

C#

using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.Tilemaps; public class MapEditor : EditorWindow { (省略) private void GenerateTile() { bool returns = EditorUtility.DisplayDialog("Attention", "If you continue this function, the tilemap detas will lose. If you want to continue, click \"continue\".", "continue", "cancel"); if (!returns) { return; } Tilemap[] tilemaps = GameObject.FindGameObjectWithTag("tilemap").GetComponents<Tilemap>(); //Debug.Log(tilemaps.Length); for (int a = 0; a < tilemaps.Length; a++) { tilemaps[a].ClearAllTiles(); tilemaps[a].size = new Vector3Int(EventFunctions.TILEMAP_MAXRANGE_X, EventFunctions.TILEMAP_MAXRANGE_Y, 1); } for (int a = 0; a < asyncOperationHandleTileBases.Count; a++) Addressables.Release(asyncOperationHandleTileBases[a]); // 3次元配列定義(第1引数はレイヤー、第2、3は直交xy座標) string[,,] tileLayout = new string[tilemaps.Length, EventFunctions.TILEMAP_MAXRANGE_X, EventFunctions.TILEMAP_MAXRANGE_Y]; // タイル配列作成処理 if (tiles.Count > 0) { for (int a = 0; a < tiles.Count; a++) { int startX, startY, endX, endY; string[] places = tiles[a].Place; foreach (string place in places) { startX = int.Parse(place.Split(':')[1].Split('-')[0]); startY = int.Parse(place.Split(':')[2].Split('-')[0]); if (place.Split(':')[1].Split('-').Length == 2) endX = int.Parse(place.Split(':')[1].Split('-')[1]); else endX = startX; if (place.Split(':')[2].Split('-').Length == 2) endY = int.Parse(place.Split(':')[2].Split('-')[1]); else endY = startY; string tileName = tiles[a].Tile_Name; int layerNum = int.Parse(place.Split(':')[0]); //Debug.Log(place); //Debug.Log(tileName); //Debug.Log(layerNum); for (int b = startX; b <= Math.Min(endX, EventFunctions.TILEMAP_MAXRANGE_X); b++) { for (int c = startY; c <= Math.Min(endY, EventFunctions.TILEMAP_MAXRANGE_Y); c++) { tileLayout[layerNum, b, c] = tileName; } } } } } Dictionary<string, AsyncOperationHandle<TileBase>> tileBaseStack = new Dictionary<string, AsyncOperationHandle<TileBase>>(); // 配置 for (int a = 0; a < tilemaps.Length; a++) { for (int b = 0; b < EventFunctions.TILEMAP_MAXRANGE_X; b++) { for (int c = 0; c < EventFunctions.TILEMAP_MAXRANGE_Y; c++) { if (string.IsNullOrEmpty(tileLayout[a, b, c])) continue; Debug.Log(tileLayout[a, b, c]); if (!tileBaseStack.ContainsKey(tileLayout[a, b, c])) { Debug.Log("a"); //問題発生箇所 Addressables.LoadAssetAsync<TileBase>(tileLayout[a, b, c]).Completed += op => { Debug.Log(op.Result); tilemaps[a].SetTile(new Vector3Int(b, c, 0), op.Result); asyncOperationHandleTileBases.Add(op); tileBaseStack.Add(tileLayout[a, b, c], op); }; } else { Debug.Log("b"); tilemaps[a].SetTile(new Vector3Int(b, c, 0), tileBaseStack[tileLayout[a, b, c]].Result); } } } } } (省略) }

試したこと

  • GenerateTile関数をIEnumeratorとしてみようと考えましたが、MapEditorクラスがMonoBehaviourを継承していないのでStartCoroutineが使えず断念しました。

補足情報(FW/ツールのバージョンなど)

Unity 2020.3.26f1

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。