今天,跟队长一起将我之前做的怪物系统与他自己做的人物行为、技能系统整合到一起。
但是我由于第一次做怪物AI,所以整体并不是很熟练,导致整合过程中耦合问题挺大的= =…
甚至有一些脚本名称重合导致队长那边的系统冒出了挺多的报错。
下午队长就跟我开腾讯会议,分享屏幕让我把一个一个怪物设计逻辑讲清楚(其实我也写了文档的,但是对着代码讲或许更清晰)
然后因为耦合大的问题,我们重新把代码里的功能重新复制进去。还好每一只怪物地代码不多,所以这也解耦就还好,也蛮快的。
首先是一只“壁虎精”:
1.绕着平台不断行走;2.不可主动攻击;3.玩家触碰则受伤。
它的主要逻辑很简单,就是设置4个点,调好角度参数,搭上动画,写好行走代码。
public class EasyMons : Enemy
{
public float moveSpeed;
public GameObject[] wayPoints;
int nextWaypoint = 1;
float distToPoint;
void Update()
{
Move();
}
void Move()
{
//计算两点之间的距离
distToPoint = Vector2.Distance(transform.position,
wayPoints[nextWaypoint].transform.position);
transform.position = Vector2.MoveTowards(transform.position,
wayPoints[nextWaypoint].transform.position,moveSpeed*Time.deltaTime);
if (distToPoint < 0.2f)
{
TakeTurn();
}
//转向
void TakeTurn()
{
Vector3 currRot = transform.eulerAngles;
currRot.z += wayPoints[nextWaypoint].transform.eulerAngles.z;
transform.eulerAngles = currRot;
ChooseNextWaypoint();
}
//选择下一个点
void ChooseNextWaypoint()
{
nextWaypoint++;
if (nextWaypoint == wayPoints.Length)
{
nextWaypoint = 0;
}
}
}
}
运行之后我们感觉转向的地方有点生硬了,试图优化,
首先队长考虑了能不能使用【插值】的方法解决,然后搜了一下unity的文档,查用法(我们都是第一次做游戏)
确实是可以的,然后就有了下面的优化措施:(虽然好像有点繁琐hhh不过我们只想优化出效果)
void TakeTurn()
{
targetRotZ = wayPoints[nextWaypoint].transform.eulerAngles.z;
if (Math.Abs(transform.eulerAngles.z - targetRotZ) > 0.1f)
{
float curZ = transform.eulerAngles.z + 90 / (50 * rotationTime);
transform.eularAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, curZ);
}
if (Math.Abs(transform.eulerAngles.z - targetRotZ) < 0.1f)
ChooseNextWaypoint();
}
优化之后,壁虎精在转角处的转向确实更顺滑了许多。