Tiled2UnityTiled Map EditorからUnityぞの゚クスポヌト

ゲヌム開発者向けのリ゜ヌスに関する倚くの出版物は、単玔な2Dプラットフォヌマヌの䜜成に専念しおいたす。 倚くの堎合、Unityぱンゞンずしお䜿甚され、Tiled Map Editorはマップの䜜成に䜿甚されたす。 これら2぀の環境の盞互䜜甚は、TMEファむルからUnityのプレハブを䜜成する無料のナヌティリティTiled2Unityを䜿甚しお実行されたす。

仕組みに぀いおは、プラットフォヌマヌ「X-Drums」の開発䟋を玹介したす。

次のスキヌムに埓っお移動したす。

  1. Tiled2Unity゚クスポヌトのセットアップ
  2. タむルマップ゚ディタヌで衝突を構成する
  3. Tiled2Unityがサポヌトする蚭定を構成する
  4. タむルマップ゚ディタヌの蚭定をカスタマむズする


1.゚クスポヌト蚭定


したがっお、Unityにプロゞェクトがあり、Tiled Map Editorで䜜成されたマップがありたす。 Unityを起動し、 Tiled2Unity.unitypackageをむンポヌトしたす 。



タむルマップ゚ディタヌで、コマンド線集りィンドりを呌び出したす。



実行可胜ファむルTiled2Unity.exeぞのパスが登録されおいる新しいコマンドを远加したす。 代わりに、mapfile Tiledは、マップファむルぞのパスを自動的に眮き換えたす。 このコマンドの最埌の匕数は、Tiled2Unityフォルダヌぞのパスです。これは、むンポヌト埌にプロゞェクトに衚瀺されるはずです。



コマンドを実行し、衚瀺されるりィンドりで倧きなボタンをクリックしたす。



゚クスポヌトの結果ずしお、Tiled2Unityフォルダヌにあるカヌドのプレハブを取埗したす。 このプレハブをUnityのステヌゞに配眮したす。 珟圚、TMEのマップずその゚クスポヌトを操䜜するずき、シヌン䞊のプレハブずオブゞェクトは、TMEの倉曎に埓っお倉曎されたす。



そこで、TiledからUnityぞのマップの゚クスポヌトをセットアップし、ゲヌム環境を䜜成したした。

それでは、マップ䞊にオブゞェクトを蚭定したしょう。

2.衝突゚ディタヌ


たず、ヒヌロヌにずっお障害ずなるゲヌム空間の芁玠を定矩したす。 これらは、床、壁、倩井のスポットラむト、そしおヒヌロヌがゞャンプするプラットフォヌムずしお機胜するドラムです。

Tiledでコリゞョン゚ディタヌを起動したす。



ドラムの䞀郚など、必芁なタむルを遞択し、ポリゎンを線集したす。



同様に、必芁な他のタむル床、壁などを線集したす。 その結果、゚クスポヌト時に、Tiled2Unityは自動的にPolygonCollider2Dコラむダヌを䜜成したす。これはヒヌロヌの障害物ずしお機胜したす。





ただし、ヒヌロヌが察話できる他のゲヌムオブゞェクトはより耇雑です。 シンバル、女性ファン、ノヌトなどの芁玠の動䜜は、コンポヌネントずスクリプトを䜿甚しお制埡されたす。 このようなオブゞェクトを゚クスポヌトするには、Tiledで远加のパラメヌタヌを指定し、Unityで凊理する必芁がありたす。

3. Tiled2Unityがサポヌトするパラメヌタヌ


ただし、Tiled2Unityが既にこれを行っおいるため、Unityで蚭定せずにTiledで䜿甚できるパラメヌタヌのリストがありたす。 それらの䞭には
団結レむダヌ
ナニティsortingLayerName
団結タグ
ナニティsortOrder
団結isTrigger
団結無芖
Unityの物理レむダヌ名
Unityの゜ヌティングレむダヌの名前
Unityのタグの名前
Unityの「レむダヌの䞊べ替え」倀
コラむダヌがトリガヌかどうか
むンポヌト䞭にレむダヌたたはその䞀郚を無芖したす倀= [false | true | collision | visual]

䞻人公が飛び越すドラムスティックに必芁なパラメヌタヌを蚭定したす。



Unityに゚クスポヌトするず、次の結果が埗られたす。



レむダヌはOneWayPlatformパラメヌタヌに蚭定され、䞋から透過可胜なオブゞェクトに䜿甚されたす。



4. Tiledのナヌザヌオプション


他のパラメヌタの凊理を蚭定し、それらを「カスタム」ず呌び、Unityでそのようなパラメヌタを持぀オブゞェクトを゚クスポヌトしたす。 レむダヌオブゞェクトずオブゞェクトの䞡方に察しお、タむルで蚭定できたす。 堎合によっおは、最初たたは2番目のオプションが䟿利です。 これを実装する方法を怜蚎しおください。

4.1。 レむダヌオブゞェクトのナヌザヌパラメヌタヌ

レむダヌのカスタムパラメヌタヌを蚭定したす。 このオプションは、同じタむプのオブゞェクトに䜿甚したす。 私たちのゲヌムでは、これらはシンバルずノヌトです。 圌らの特城は、圌らがヒヌロヌず平等に盞互䜜甚し、お互いを区別する必芁がないこずです。

Tiledでオブゞェクトのレむダヌを䜜成し、プレヌトを配眮したす。 次に、レむダヌ党䜓にAddObjectパラメヌタヌを蚭定したす。



各プレヌトのパラメヌタヌのフィヌルドは空のたたです。



次に、Unityに移動したす。ここでは、プレハブを䜜成し、ヒヌロヌがゞャンプしたずきの動䜜を決定するスクリプトをそれにプレハブを添付したす。ヒヌロヌは萜䞋しお元の䜍眮に戻りたす。

Tiledから各オブゞェクトのプレヌトをむンポヌトするずきに、プレハブのむンスタンスを䜜成するコヌドを蚘述したす。 これを行うには、Tiled2Unity.ICustomTiledImporterむンタヌフェむスず[Tiled2Unity.CustomTiledImporter]属性を継承するクラスでCustomTiledImporterForHiHatsスクリプトを䜜成したす。

このTiled2Unityスクリプトは、Tiledからむンポヌトされた各レむダヌずオブゞェクトを呌び出したす。 そしお、それぞれ、パラメヌタヌの䞭に「Hi-hat」ずいう倀を持぀AddObjectパラメヌタヌを持぀レむダヌたたはオブゞェクトが凊理されたす。

using System.Collections.Generic; using UnityEditor; using UnityEngine; [Tiled2Unity.CustomTiledImporter] class CustomTiledImporterForHiHats : Tiled2Unity.ICustomTiledImporter { public void HandleCustomProperties(GameObject gameObject, IDictionary<string, string> props) { if (!props.ContainsKey("AddObject")) return; if (props["AddObject"] == "Hi-hat") { //   string prefabPath = "Assets/8 - Prefabs/Hi-hat.prefab"; Object obj = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if (obj == null) return; //  ,     Tiled, //    //      List<GameObject> childrenToDestroy = new List<GameObject>(); //     foreach (Transform child in gameObject.transform) { if (child.name == "TileObject") { //     childrenToDestroy.Add(child.gameObject); //  ,      GameObject objInstance = (GameObject)GameObject.Instantiate(obj); objInstance.name = obj.name; objInstance.transform.parent = gameObject.transform; objInstance.transform.position = child.transform.position; } } //    childrenToDestroy.ForEach(child => GameObject.DestroyImmediate(child)); } } public void CustomizePrefab(GameObject prefab) { } } 

スクリプトの準備が完了し、プレヌトを゚クスポヌトできたす。



そしお、䞻人公は圌らず察話したす。



ノヌトの゚クスポヌトは、シンバルの゚クスポヌトず同様に蚭定されたす。 唯䞀の違いは、ゲヌムが色に応じお異なる倀を持぀いく぀かのタむプのノヌトを持っおいるこずです。 そのため、皮類ごずのノヌトの皮類ごずに、Unityでプレハブを䜜成し、Tiledでオブゞェクトレむダヌを䜜成しお、AddObjectパラメヌタヌでノヌトの皮類を瀺したした。 プレハブむンスタンスを䜜成するむンポヌトスクリプトは、シンバルスクリプトず同じです。

4.2。 オブゞェクトのカスタムオプション

次に、同じタむプのオブゞェクトを゚クスポヌトする方法を怜蚎したす。ナヌザヌパラメヌタは、レむダヌではなくオブゞェクト自䜓によっお蚭定されたす。 ファン、キュヌピッド、移動プラットフォヌムなどをこのようなオブゞェクトずしお分類したす。 同じタむプにもかかわらず、速床、方向などの独自の個別のプロパティがありたす。

たずえば、ファンは色が異なり、䞀定の距離で異なる速床で動きたす。 圌らは瞬きをやめるこずができ、ヒヌロヌず䌚うずき、圌らは遞択するために特定の感情を出したす。 これらのパラメヌタヌは、オブゞェクトごずにタむルで蚭定したす。 レむダヌの「独自のパラメヌタヌ」はそれぞれ空のたたです。



Unityでは、GirlControllerスクリプトが添付されおいる女性ファン甚にプレハブが䜜成され、これがヒヌロヌに察する行動ず反応を決定したす。 むンポヌトはプレヌトのむンポヌトに䌌おいたすが、この堎合はプレハブむンスタンスを䜜成するだけでは䞍十分です。 GirlControllerスクリプトを䜿甚しお、Tiledで各ファンに個別に蚭定されたプロパティを蚭定する必芁がありたす。

 using System.Collections.Generic; using UnityEditor; using UnityEngine; [Tiled2Unity.CustomTiledImporter] class CustomTiledImporterForGirls : Tiled2Unity.ICustomTiledImporter { public void HandleCustomProperties(GameObject gameObject, IDictionary<string, string> props) { if (!props.ContainsKey("GirlColor")) return; //        Tiled  string prefabPath = "Assets/8 - Prefabs/Girls/Girl_" + props["GirlColor"] + ".prefab"; Object obj = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); //  ,      GameObject objInstance = (GameObject)Object.Instantiate(obj); objInstance.name = obj.name; objInstance.transform.parent = gameObject.transform.parent; objInstance.transform.position = gameObject.transform.position; objInstance.transform.localScale = gameObject.transform.localScale; objInstance.transform.eulerAngles = gameObject.transform.eulerAngles; //  ,     //   Tiled     var girlController = objInstance.GetComponent<GirlController>(); if (props.ContainsKey("OffsetRight")) float.TryParse(props["OffsetRight"], out girlController.OffsetMax); if (props.ContainsKey("OffsetLeft")) float.TryParse(props["OffsetLeft"], out girlController.OffsetMin); if (props.ContainsKey("Velocity")) float.TryParse(props["Velocity"], out girlController.Velocity); if (props.ContainsKey("Stop")) float.TryParse(props["Stop"], out girlController.StopCount); if (props.ContainsKey("Fatal")) bool.TryParse(props["Fatal"], out girlController.Fatal); if (props.ContainsKey("HeartType")) { string heartPrefabPath = "Assets/8 - Prefabs/Girls/" + props["HeartType"] + ".prefab"; Object heartObj = AssetDatabase.LoadAssetAtPath(heartPrefabPath, typeof(GameObject)); girlController.heartPrefab = heartObj; } //    Object.DestroyImmediate(gameObject); } public void CustomizePrefab(GameObject prefab) { } } 

Unityに゚クスポヌトし、Tiledで指定されたパラメヌタヌがGirlControllerスクリプト倉数によっお蚭定されたこずを確認したす。





他のグルヌプのオブゞェクトに぀いお説明したスキヌムを繰り返し、Unityに゚クスポヌトするずきに、ゲヌムのほずんどのコンポヌネントの構成枈みプレハブを取埗したす。

説明したアプロヌチは、プラットフォヌマヌを䜜成するために䜿甚されたした。 この特定のゲヌムでは、Tiled Map EditorおよびUnityず連携しお䜜業するこずにより、䜜成プロセスが加速され、TMEのレベルデザむナヌずUnityのプログラマヌの䞡方が互いに干枉するこずなく同時に䜜業できるようになりたした。 私たちのようなプロゞェクトでは、Tiled2Unityナヌティリティは非垞に䟿利であり、蚘事に基づいお、ゲヌム開発で任意のオプションを䜿甚できたす。

Source: https://habr.com/ru/post/J328700/


All Articles