Unity - 如何从重叠碰撞中获取单个图块

问题描述 投票:0回答:1

我正在开发一款太空采矿游戏,并试图从玩家发射采矿激光束,并删除与光束重叠的瓦片地图中的瓦片。光束是玩家枪中的静态持续矩形。下面是我以前传统上如何获得重叠的,但它总是返回 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);
            }
        }
    }

尝试获取重叠框中的单个图块数组,但获取整个图块地图

c# unity-game-engine collision
1个回答
0
投票

在触发模式下使用光线投射而不是重叠或碰撞器找到答案。问题在于,任何无形检测都不会与物体“接触”,就像用非触发碰撞器碰撞物体一样。 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);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.