Tactical Surround
游戏中的AI集群效果:由一字长蛇阵到龙门阵. 嘿嘿~~
~关门放狗~:
核心代码
// 移动到最终的位置;
void Surround()
{
// 计算每个人的位置;
int armCount = Army.Count;
for (int i = 0; i < armCount; ++i)
{
// 旋转一个角度;
//z;
float Angle = i * (360 / armCount);
// Army[i].transform.LookAt(TargetTrans);
Vector3 finalPos = new Vector3(
TargetTrans.localPosition.x + Radius * Mathf.Cos((float)(Angle * 3.14 / 180))
, TargetTrans.localPosition.y + Radius * Mathf.Sin((float)(Angle * 3.14 / 180))
, TargetTrans.localPosition.z);
// Army[i].transform.localPosition = finalPos;
// Transform localPosition to position;
finalPos = transform.parent.TransformPoint(finalPos);
iTween.MoveTo(Army[i].gameObject, finalPos, 20f);
}
}
Unity中的树形结构为
在Circle上面挂上如下的脚本
完整代码
using UnityEngine;
using System.Collections.Generic;
namespace Assets.Surrounds
{
public class SuCircle : MonoBehaviour
{
// 半径;
public float Radius = 150f;
// 目标点;
public Transform TargetTrans;
// 队伍;
public List<GameObject> Army;
void Start()
{
Initialize();
Surround();
}
// 初始化每个人的站位;
void Initialize()
{
for (int i = 0; i < Army.Count; ++i)
{
// 左右各一半站位;
if (i < Army.Count / 2)
{
Army[i].transform.localPosition = new Vector3(TargetTrans.localPosition.x - i * Radius, TargetTrans.localPosition.y - Radius);
}
else
{
Army[i].transform.localPosition = new Vector3(TargetTrans.localPosition.x + (Army.Count - i) * Radius, TargetTrans.localPosition.y - Radius);
}
}
}
// 移动到最终的位置;
void Surround()
{
// 计算每个人的位置;
int armCount = Army.Count;
for (int i = 0; i < armCount; ++i)
{
// 旋转一个角度;
//z;
float Angle = i * (360 / armCount);
// Army[i].transform.LookAt(TargetTrans);
Vector3 finalPos = new Vector3(
TargetTrans.localPosition.x + Radius * Mathf.Cos((float)(Angle * 3.14 / 180))
, TargetTrans.localPosition.y + Radius * Mathf.Sin((float)(Angle * 3.14 / 180))
, TargetTrans.localPosition.z);
// Army[i].transform.localPosition = finalPos;
// Transform localPosition to position;
finalPos = transform.parent.TransformPoint(finalPos);
iTween.MoveTo(Army[i].gameObject, finalPos, 20f);
}
}
}
}
即可实现最终的Surround效果.