资源下载 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;
}
}
}