前些天来的新项目需要成组的的出怪(怪的个数随机,怪的角度随机,怪的种类随机,首次出怪点也随机,而这些随机又随着游戏时间的进行又会改变)
最开始,也是最容易考虑到得是时间控制。
但是这种方法在这项目中不适用,因为项目随机性太强。用时间控制需要综合太多问题:个数,速度,角度,怪的种类,甚至角度正负等等等等;不用我多说大家恐怕有同感。
试了这种方法就给他放弃了,代码和其环境耦合度太高!于是就想到了以下的方法,也是很简单的方法,核心思路就是线性函数。
【直线的斜率】(刷怪需要的角度)乘以 【怪的横坐标】 等于 【纵坐标】
需要的变量:怪的个数,怪的角度
具体思路: 循环(次数为怪的个数)横坐标,根据横坐标与斜率计算纵坐标,得到的两个数为最终要的数。(本例中使用单位长度,最大横坐标与纵坐标都为1,最后只需要乘以游戏中的需要的倍增值即可)
说的可能不是很明白(表达很烂),仔细看看代码就好了
上代码(代码中用到了C#的泛型,不熟悉的建议看看先)
考虑到可读性,省略了特殊角度的考虑如:0度 90度
using UnityEngine;
using System.Collections.Generic ;
public class CreateEnemyPositions
{
//currentGroupCount 当前需要产生的怪的个数
//currentGroupAngle 当前怪所排成的角度值 (单位是度,正负决定队伍的排列方向)
private static List< Vector3 > EquationAngle ( int currentGroupCount , int currentGroupAngle )
{
List< Vector3 > PosInfoCurrent = new List<Vector3> ();
float currentTan = Mathf .Tan ( Mathf.PI / 180 * currentGroupAngle) ; //角度的正切值(斜率)
float currentOffset = 1.0F / ( currentGroupCount - 1 ) ; //偏移(间隔)
if ( currentGroupAngle > 0 ) //正角度
{
for ( int i = 0 ; i < currentGroupCount ; i ++ )
{
PosInfoCurrent.Add ( new Vector3 ( i * currentOffset , 0 , currentTan * i * currentOffset ) );
}
}
else if ( currentGroupAngle < 0 ) //负角度
{
for ( int i = 0 ; i < currentGroupCount ; i ++ )
{
PosInfoCurrent.Add ( new Vector3 ( i * currentOffset , 0 , currentTan * ( i * currentOffset - 1 ) ) );
}
}
return PosInfoCurrent;
}
//
}
用法 List<Vector3 > test = EquationAngle ( 4 , 60 ) ;
返回值:
为一堆Vector3的集合,单位长度为1的,例如:屏幕宽为240,需要让怪在这个范围均匀排开则:
//
List<Vector3 > cur = new List<Vector3 > ();
foreach ( Vector3 tt in test )
{
cur.Add( tt * 240 );
}
//
最后得到的新集合便是实际坐标
最后得出的结果可以压入队列挨个实例化,非本次重点省略(对于Iphone游戏千万别为了省事一次性实例化队列,会严重丢帧)