IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity2d 学习笔记(三)敌人自动巡航 -> 正文阅读

[游戏开发]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();
    }
}

最后实现的效果就是这样

画面有点粗糙哈哈。

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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:48:06  更:2021-10-12 23:48:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:34:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码