Dub*_*oni 4 c# unity-game-engine
private void FormationTriangle()
{
newpositions = new List<Vector3>();
for (int x = 0; x < squadMembers.Count; x++)
{
for (int y = x; y < 2 * (squadMembers.Count - x) - 1; y++)
{
Vector3 position = new Vector3(x, y);
newpositions.Add(position);
}
}
move = true;
formation = Formation.Square;
}
Run Code Online (Sandbox Code Playgroud)
循环是错误的.它把小队成员一个放在另一个上面.甚至不接近三角形.我希望小队成员站成三角形.
这是移动部分:但问题在于计算三角形形状位置的循环.我做的其他编队工作正常.
private void MoveToNextFormation()
{
if (randomSpeed == false)
{
if (step.Length > 0)
step[0] = moveSpeed * Time.deltaTime;
}
for (int i = 0; i < squadMembers.Count; i++)
{
squadMembers[i].transform.LookAt(newpositions[i]);
if (randomSpeed == true)
{
squadMembers[i].transform.position = Vector3.MoveTowards(
squadMembers[i].transform.position, newpositions[i], step[i]);
}
else
{
squadMembers[i].transform.position = Vector3.MoveTowards(
squadMembers[i].transform.position, newpositions[i], step[0]);
}
if (Vector3.Distance(squadMembers[i].transform.position, newpositions[i]) <
threshold)
{
if (squareFormation == true)
{
Vector3 degrees = new Vector3(0, 0, 0);
Quaternion quaternion = Quaternion.Euler(degrees);
squadMembers[i].transform.rotation = Quaternion.Slerp(
squadMembers[i].transform.rotation, quaternion,
rotateSpeed * Time.deltaTime);
}
else
{
squadMembers[i].transform.rotation = Quaternion.Slerp(
squadMembers[i].transform.rotation, quaternions[i],
rotateSpeed * Time.deltaTime);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
让我们看一下位置列表中包含的简单值, n = 3
首先,循环x从0到2(3 - 1)然后对于每个x,循环从x到4-x(3*2 - x - 1 - 1)
记住它a<b是相同的a<=b-1
这给了我们......
0,0
0,1
0,2
0,3
0,4
1,1
1,2
1,3
2,2
Run Code Online (Sandbox Code Playgroud)
这是很多职位.当然超过3个单位可以占用!至少它是一个三角形:
X\Y 0 1 2 3 4
0 # # # # #
1 # # #
2 #
Run Code Online (Sandbox Code Playgroud)
主要的问题是,你产生办法超过需要的位置,并希望以某种方式填充它.
你需要根据三角形的面积公式计算你的宽度和高度:A = (b*h)/2你甚至可能想要b=h,在哪里A = number of units.
所以,像这样:
int b = Mathf.CeilToInt(Mathf.Sqrt(squadMembers.Count));
for (int x = 0; x < b; x++)
{
//the divide by 2 is accounted for with this 2*
for (int y = x; y < 2 * (b - x) - 1; y++)
{
Vector3 position = new Vector3(x, y);
newpositions.Add(position);
}
}
Run Code Online (Sandbox Code Playgroud)
由于您无法保证三角形的数量非常完美,因此您应该高估三角形的大小,计算已放置的单位数,然后在达到极限时退出它们.
首先,找到最小三角形数字的高度大于你的单位数,以及那个三角形数字本身:
x
x x
x x x
x x x x
x x x x x
Run Code Online (Sandbox Code Playgroud)
然后,找到第一个单元的位置.我们需要知道我们有多少行槽以及底行槽的宽度:
x
x x
x x x
x x x x
x x x
Run Code Online (Sandbox Code Playgroud)
然后,添加,直到你添加足够的
int height = Mathf.CeilToInt( (Mathf.Sqrt(8*squadMembers.Count+1f)-1f)/2 )
int slots = (int)(height * (height+1f)/2f)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |