我正在开发一款太空采矿游戏,并试图从玩家发射采矿激光束,并删除与光束重叠的瓦片地图中的瓦片。光束是玩家枪中的静态持续矩形。下面是我以前传统上如何获得重叠的,但它总是返回 0,0,0 坐标,我认为这是整个图块地图,而不是与“目标”重叠的各个图块,因为“目标”仅返回 1 个恒定结果。
任何比我脑子更笨的人都可以帮我修复这个代码,这样我就可以得到单独的图块位置而不是整个图块地图吗?
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class Laser : MonoBehaviour
{
[SerializeField] float range;
private Tilemap tilemap;
private GameObject player;
void Start()
{// Start is called before the first frame update
tilemap = GameObject.Find("Destructible Tiles").GetComponent<Tilemap>();
player = GameObject.Find("Player");
}
void Update()
{// Update is called once per frame
PlayerInput();
}
private void PlayerInput()
{
if (Input.GetMouseButton(0))
{//left mouse click
Fire();
}
}
private void Fire()
{
//player coords
float px = player.transform.position.x;
float py = player.transform.position.y;
//coords for box overlap centerpoint
float offset;
if (range <= 1)
{
offset = 1;
}
else
{
offset = (range / 2) + 0.5f;
}
//get all targets in range of laser
Collider2D[] targets = { };
if (player.transform.localScale.x == 1)
{//facing right
targets = Physics2D.OverlapBoxAll(new Vector2(px + offset, py), new Vector2(range, 0.1f), 0);
}
else if (player.transform.localScale.x == -1)
{//facing left
targets = Physics2D.OverlapBoxAll(new Vector2(px - offset, py), new Vector2(range, 0.1f), 0);
}
foreach (Collider2D target in targets)
{
if (target.tag == "Ground")
{//target is minable
Vector3Int tile = tilemap.WorldToCell(target.transform.position);
tilemap.SetTile(tile, null);
}
}
}
尝试获取重叠框中的单个图块数组,但获取整个图块地图
在触发模式下使用光线投射而不是重叠或碰撞器找到答案。问题在于,任何无形检测都不会与物体“接触”,就像用非触发碰撞器碰撞物体一样。 Raycast 有一个碰撞组件(“点”),您可以从中获取坐标。对于那些不得不遭受这个问题并因此而变成谷歌紫色的人。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Tilemaps;
using UnityEngine.UIElements;
using static UnityEngine.GraphicsBuffer;
public class Laser : MonoBehaviour
{
[SerializeField] float range;
[SerializeField] LayerMask laserTargets;
private Tilemap tilemap;
private GameObject player;
void Start()
{// Start is called before the first frame update
tilemap = GameObject.Find("Destructible Tiles").GetComponent<Tilemap>();
player = GameObject.Find("Player");
}
void Update()
{// Update is called once per frame
PlayerInput();
}
private void PlayerInput()
{
if (Input.GetMouseButton(0))
{//left mouse click
Fire();
}
else
{
}
}
private void Fire()
{//fire laser and check for contacts
RaycastHit2D ray = new RaycastHit2D();
if (player.transform.localScale.x == 1)
{//facing right
ray = Physics2D.Raycast(transform.position, Vector2.right, range, laserTargets);
}
else if (player.transform.localScale.x == -1)
{//facing left
ray = Physics2D.Raycast(transform.position, Vector2.left, range, laserTargets);
}
if (ray.collider == true)
{//ray has a hit return
if (ray.collider.gameObject.CompareTag("Ground"))
{//hit is minable
//get coords of ray contact and translate into tile coordinates
Vector3 hitpos = Vector3.zero;
hitpos.x = ray.point.x - 0.01f * ray.normal.x;
hitpos.y = ray.point.y - 0.01f * ray.normal.y;
Vector3Int tile = tilemap.WorldToCell(hitpos);
//set tile to empty
tilemap.SetTile(tile, null);
}
}
}