使用Tilemap复合对撞机作为触发器,获取实际被触发的子对撞机的最佳方法是什么



这似乎比应该的要简单得多。我使用一个带有复合碰撞器的Tilemap作为触发器在地图上绘制梯子,并希望在玩家攀爬梯子时将其锁定在梯子的中心x点。然而,我遇到了一堵墙,因为很难简单地找到被碰撞的瓷砖。

其他地方提到的方法只适用于碰撞(即非触发器(,即使对于我所期望的常规任务来说,这似乎也有些复杂。

有人对如何做到这一点有什么建议吗?我需要以某种方式获得触发器的接触点(似乎不受支持(,然后发射光线来获得碰撞器,或者在场景中添加额外的游戏对象,这些对象可以充当梯子的锚,这似乎与使用波浪形贴图的点背道而驰。

谢谢你的帮助。

有一种方法可以在瓦片映射的瓦片位置创建一个单独的碰撞器来使用该位置。

它比光线投射更准确。

因为这是一个示例脚本,请重构并使用它

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
[RequireComponent( typeof( Tilemap ) )]
public class TilemapCollider : MonoBehaviour
{
Tilemap t;
void Start()
{
t = GetComponent<Tilemap>();
BoundsInt bounds = t.cellBounds;
TileBase[] allTiles = t.GetTilesBlock( bounds );
var s = t.layoutGrid.cellSize / 2;
var availablePlaces = new List<Vector3>();
for( int n = t.cellBounds.xMin; n < t.cellBounds.xMax; n++ )
{
for( int p = t.cellBounds.yMin; p < t.cellBounds.yMax; p++ )
{
Vector3Int localPlace = ( new Vector3Int( n, p, (int)t.transform.position.y ) );
Vector3 place = t.CellToWorld( localPlace );
var tile = t.GetTile( localPlace );
if( tile )
{
availablePlaces.Add( place );
var c = new GameObject().AddComponent<BoxCollider2D>();
c.isTrigger = true;
c.transform.parent = t.transform;
c.transform.localPosition = t.CellToLocal( localPlace ) + s;
Debug.Log( "x:" + n + " y:" + p + " tile:" + tile.name );
}
}
}
}
}

TilemapCollider.cs

private void OnTriggerEnter2D( Collider2D collision )
{
var tilemap = GameObject.Find( "Grid/Tilemap" ).GetComponent<Tilemap>();
tilemap.SetTile( tilemap.WorldToCell( collision.transform.position ), null );
}

在OnTriggerEnter2D 上查找位置的示例

最新更新