首页 > 解决方案 > 如何从碰撞中检查对象名称?

问题描述

例子

我想将红色圆圈移动到另一个仅与当前方形游戏对象发生碰撞的框位置。

在我当前的代码中,例如单击该游戏对象(正方形)中的一个。红色圆圈的位置将等于我点击的正方形的位置。我需要移动红色圆圈只是相邻的正方形。使用碰撞或其他风格我怎样才能轻松地制作这种逻辑?

标签: c#

解决方案


在此处输入图像描述

在此处输入图像描述

执行:

public class StackOverflowScript : MonoBehaviour
{
    public Detector CircleObject;

    public SquareItem SquarePrefab;
    public Vector2 SpawnOffset;

    List<SquareItem> _squares = new List<SquareItem>();

    private void Start()
    {
        InitGrid();
    }

    public void InitGrid()
    {
        for (int i = 0; i < 6; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                var pos = new Vector2(i, j) * SpawnOffset;
                SquareItem square = Instantiate(SquarePrefab, pos, Quaternion.identity) as SquareItem;
                square.Init(this, pos);
                _squares.Add(square);
            }
        }
    }

    public void MoveCircle(SquareItem item, Vector2 newPos)
    {
        if (CircleObject.Squares.Contains(item))
            CircleObject.MoveTowardPos(newPos);
    }
}

public class SquareItem : MonoBehaviour
{
    private StackOverflowScript _stackScript;

    public Vector2 Position
    {
        get; private set;
    }

    public void Init(StackOverflowScript script, Vector2 squarePosition)
    {
        _stackScript = script;
        Position = squarePosition;
    }


    private void OnMouseDown()
    {
        _stackScript.MoveCircle(this, this.transform.position);
    }
}

using System.Linq;

public class Detector : MonoBehaviour
{
    public List<SquareItem> Squares
    {
        get; private set;
    }

    public float DetectionRadius = 2f;

    void FixedUpdate()
    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(this.transform.position, DetectionRadius);

        Squares = colliders.ToList().FindAll(el => el.GetComponent<SquareItem>() != null).Select(el => el.GetComponent<SquareItem>()).ToList();
    }

    //This is for drawing the red circle in the inspector so you can control the radius of detection.
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(this.transform.position, DetectionRadius);
    }

    public void MoveTowardPos(Vector2 newPos)
    {
        this.transform.position = newPos;
    }
}

解释:

StackOverflowScript 用于启动正方形网格并控制圆的移动。

SquareItem 是为您实例化的每个正方形附加的脚本,它现在包含位置信息。

Detector 是附加到您的圆圈/播放器的脚本,它使用 Physics2D Overlaps 测试是否在一定半径内的邻居中有正方形。

当方形项目被按下时,它会将其信息发送到负责检查方形是否在圆的检测半径内的 stackoverflow 脚本。如果是这样,将圆圈移动到方形位置。

希望这可以帮助!

执行 Gif

干杯!


推荐阅读