unity 位置 管理

本文介绍了一个Unity中的空间矩阵管理系统,该系统能够生成并管理场景中的辅助点,支持位置点的分配与回收。通过定义PositionInfo类来存储位置信息、占用状态及实体映射标志,并通过MatrixPos类实现具体的空间管理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资源下载 http://download.youkuaiyun.com/download/tianyongheng/10161641
场景中生成的一些辅助点,占用,回收等功能.有demo可以下载,细节就不讲了

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PositionInfo
{
    /// <summary>
    /// 位置点
    /// </summary>  

    public Vector3 pos;
    /// <summary>
    /// 是否被占用
    /// </summary>  

    public bool isUse;
    /// <summary>
    /// 和实体映射 标记
    /// </summary>
    public int flag;

}

public class MatrixPos: MonoBehaviour {
    public MatrixPosManager.PosFlag flag;
    /// <summary>
    /// 每个行元素之间的间距(列间距)
    /// </summary>
    [HideInInspector]
    public float columnSpacing=0;
    /// <summary>
    /// 每一行之间的间隔(行间距)
    /// </summary>
    [HideInInspector]
    public float rowSpacing=0;
    /// <summary>
    /// child排列多少行
    /// </summary>
    [HideInInspector]
    public int row = 0;

    /// <summary>
    /// 每一行多少个child
    /// </summary>
    [HideInInspector]
    public int column = 0;
    public List<PositionInfo> listPos = new List<PositionInfo>();
    void Awake()
    {
        InitData();
    }

    void AddListener()
    {

    }

    // Use this for initialization
    void Start () {

    }
    void InitData()
    {
        Transform child = transform.Find("child");
        for (int i=0;i< child.childCount;i++)
        {
            Vector3 v = child.GetChild(i).position;
            listPos.Add(new PositionInfo() { pos = new Vector3(v.x, v.y, v.z), isUse = false });
        }
        Destroy (child.gameObject);
    }
    public void SpawnPoint()
    {

        Transform child= transform.Find("child");
        for (int i=0;i<row;i++)
        {        
            for (int j = 0; j < column; j++)
            {
                Vector2 p = ComputerPosition(i,j);
                GameObject go=   GameObject.CreatePrimitive(PrimitiveType.Sphere);
                go.name = i.ToString() + j.ToString();
                go.transform.SetParent(child);
                go.transform.localPosition = new Vector3(p.y, 0, p.x);              
            }        
        }
    }
    /// <summary>
    /// x:是行位置,y:是列位置
    /// </summary>
    /// <param name="row"></param>
    /// <param name="col"></param>
    /// <returns></returns>
   Vector2 ComputerPosition(int row,int col)
    {
     return new  Vector2  (row* rowSpacing, col* columnSpacing);
    }
    public Vector3 PushChild(int flag)
    {
        Vector3 v=Vector3.zero;
        for(int i=0;i<listPos.Count;i++)
        {
            if(!listPos[i].isUse)
            {

                v = listPos[i].pos;
                listPos[i].isUse = true;
                listPos[i].flag = flag;//建立映射关系
                break;
            }
        }

        return v;
    }
    ///// <summary>
    ///// 移除child
    ///// </summary>
    ///// <param name="flag"></param>
    public void RemoveChild(int flag)
    {
        for (int i = 0; i < listPos.Count; i++)
        {
            if (listPos[i].isUse&&listPos[i].flag==flag)
            {
                listPos[i].flag = 0;
                listPos[i].isUse = false;
                Debug.Log("移除me:" + flag);
                break;
            }
        }
    }
    void Update()
    {

    }

}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MatrixPosManager : MonoBehaviour {
    public enum PosFlag
    {
        none,
        one,
        two,
    }
    Dictionary<PosFlag, MatrixPos> flagPosDic = new Dictionary<PosFlag, MatrixPos>();
    private void Awake()
    {
        InitData();   
    }
    /// <summary>
    /// 保存映射
    /// </summary>
    void InitData()
    {
        foreach (PosFlag flag in Enum.GetValues(typeof(PosFlag)))
        {
            if (flag == PosFlag.none)
            {
                continue;
            }
            if (transform.Find(flag.ToString()))
            {
                if (transform.Find(flag.ToString()).GetComponent<MatrixPos>())
                {
                    if (!flagPosDic.ContainsKey(flag))
                    {
                        flagPosDic.Add(flag, transform.Find(flag.ToString()).GetComponent<MatrixPos>());
                    }
                }
            }
        }
    }
    public Vector3 PushChild(PosFlag posFlag,int flag)
    {
        Vector3 v=Vector3.zero;
        MatrixPos matrixPos = null;
        if (flagPosDic.TryGetValue(posFlag, out matrixPos))
        {
           v= matrixPos.PushChild(flag);
            matrixPos = null;
        }
        return v;
    }
    public void RemoveChild(PosFlag posFlag, int flag)
    {
        MatrixPos matrixPos = null;
        if (flagPosDic.TryGetValue(posFlag, out matrixPos))
        {
            matrixPos.RemoveChild(flag);
            matrixPos = null;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tianyongheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值