Unity3d 使用Tilemap复合碰撞器作为触发器,获取实际被触发的次碰撞器的最佳方法是什么?

Unity3d 使用Tilemap复合碰撞器作为触发器,获取实际被触发的次碰撞器的最佳方法是什么?,unity3d,Unity3d,这似乎比它应该的要简单得多。我使用一个带有复合碰撞器的Tilemap作为触发器在地图上绘制梯子,并希望在玩家攀爬梯子时将玩家锁定在梯子的中心x点。然而,我碰到了一堵墙,因为它似乎很难简单地控制被碰撞的单个瓷砖 其他地方提到的方法只适用于碰撞(即非触发器),甚至对于我所期望的例行任务来说,这似乎有些复杂 有人对如何做到这一点有什么建议吗?我需要以某种方式获得触发器的接触点(似乎不受支持),然后发射光线以获得碰撞器,或者在场景中添加其他游戏对象,作为梯子的锚,这似乎与使用tilemaps的点相反 感

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

其他地方提到的方法只适用于碰撞(即非触发器),甚至对于我所期望的例行任务来说,这似乎有些复杂

有人对如何做到这一点有什么建议吗?我需要以某种方式获得触发器的接触点(似乎不受支持),然后发射光线以获得碰撞器,或者在场景中添加其他游戏对象,作为梯子的锚,这似乎与使用tilemaps的点相反


感谢您的帮助。

有一种方法可以在平铺贴图的平铺位置创建单独的碰撞器,以使用该位置

它比光线投射更精确

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

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 );
                }
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.Tilemaps;
[RequiredComponent(typeof(Tilemap))]
公共类TilemapCollider:单一行为
{
Tilemap t;
void Start()
{
t=GetComponent();
BoundsInt bounds=t.cellbunds;
TileBase[]allTiles=t.GetTilesBlock(边界);
var s=t.layoutGrid.cellSize/2;
var availablePlaces=新列表();
for(int n=t.cellBounds.xMin;n
TilemapCollider.cs

private void OnTriggerEnter2D( Collider2D collision )
{
    var tilemap = GameObject.Find( "Grid/Tilemap" ).GetComponent<Tilemap>();
    tilemap.SetTile( tilemap.WorldToCell( collision.transform.position ), null );
}
private void OnTriggerEnter2D(已碰撞R2D碰撞)
{
var tilemap=GameObject.Find(“Grid/tilemap”).GetComponent();
tilemap.SetTile(tilemap.WorldToCell(collision.transform.position),null);
}
在OnTiggerEnter2D上查找位置的示例