Unity2d 学习笔记(三)敌人自动巡航

实现思路

在游戏中,敌人通常是可以自动在地图上巡航的,这篇文章就用一个脚本简单实现这个功能。
我使用的精灵如下所示

假设我们让敌人沿着矩形自动巡航,那么我们需要写一个小型的状态机,一共有四种状态:上,下左,右。加入我们要让敌人按照顺时针方向的矩形路径自动巡航,那么状态切换应该是 上->右->下->左 。然后我们设定一下每个方向巡航的距离,这个距离就是函数检查的次数(不是物理意义上的距离),每当函数检查一次,那么这个距离就减一,当这个距离等于0的时候我们需要切换状态,然后重新设定距离的值。

以上就是简单的自动巡航的思路,按照这个思路,你可以写出复杂的自动巡航路线。当然这种实现方式可能不是最好的,因为这是我接触到这个问题的时候想到的第一种方案。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GebulinController : MonoBehaviour
{

    // 哥布林的速度
    public float speed = 5;

    Animator animator;

    Rigidbody2D rd2D;

    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
        rd2D = GetComponent<Rigidbody2D>();
    }


    enum state
    {
        up = 1,
        right = 2,
        down = 3,
        left = 4
    }


    // x方向和y方向,取值为1,0,-1
    public int direction_x = 0;
    public int direction_y = 0;


    
    public int EnemyState = (int)state.up;

    // 某个方向巡航的帧数
    public static int maxFlame = 500;
    public int flame = maxFlame;

    // 自动巡航
    void autoWalk()
    {
        Debug.Log("开始巡航");

        flame = flame - 1;


        if (EnemyState == (int)state.up)
        {
            direction_x = 0;
            direction_y = 1;
        } else if (EnemyState == (int)state.right)
        {
            direction_x = 1;
            direction_y = 0;
        } else if (EnemyState == (int)state.down)
        {
            direction_x = 0;
            direction_y = -1;
        } else if (EnemyState == (int)state.left)
        {
            direction_x = -1;
            direction_y = 0;
        } else
        {
            Debug.Log("出错啦,没有这个状态!");
        }

        // 更新方向
        Vector2 p = transform.position;
        p.x = p.x + direction_x * speed * Time.deltaTime;
        p.y = p.y + direction_y * speed * Time.deltaTime;
        transform.position = p;

        if (flame == 0)
        {
            if(EnemyState == (int)state.up)
            {
                EnemyState = (int)state.right;
            } else if (EnemyState == (int)state.right)
            {
                EnemyState = (int)state.down;
            } else if (EnemyState == (int)state.down)
            {
                EnemyState = (int)state.left;
            } else if (EnemyState == (int)state.left)
            {
                EnemyState = (int)state.up;
            }
            flame = maxFlame;
        }
    }

    // Update is called once per frame
    void Update()
    {
        autoWalk();
    }
}

最后实现的效果就是这样

画面有点粗糙哈哈。

如果你有更好的方法欢迎和我交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值