[2021.10.18]<呆头熊的开发日记>怪物AI(1)

本文记录了一次游戏开发中优化怪物AI转向逻辑的过程。开发者在整合怪物系统和人物行为、技能系统时遇到耦合问题,通过调整代码实现了壁虎精的简单行走逻辑。在转向环节,通过引入插值方法改善了转向生硬的问题,使得壁虎精在转角处的转向更加平滑。
摘要由CSDN通过智能技术生成

今天,跟队长一起将我之前做的怪物系统与他自己做的人物行为、技能系统整合到一起。

但是我由于第一次做怪物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();
}

优化之后,壁虎精在转角处的转向确实更顺滑了许多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值