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