B站Unity学习笔记
链接:https://www.bilibili.com/video/BV12s411g7gU

敌人

策划
需求分析

代码实现
  1. 敌人马达EnemyMotorEnemyMotor类
    -定义朝向目标点旋转的方法
    -定义寻路的方法
    -定义向前移动的方法
/// <summary>
/// 敌人马达类
/// 提供移动、旋转、寻路功能
/// </summary>
public class EnemyMotor : MonoBehaviour
{public WayLine line;//当前路点的索引默认是0private int currentPointIndex;public float moveSpeed = 5;/// <summary>/// 向前移动/// </summary>public void MovementForward(){this.transform.Translate(0,0,moveSpeed*Time.deltaTime);}/// <summary>/// 注视旋转/// </summary>/// <param name="point">需要注视的目标点</param>public void LookRotation(Vector3 targetPoint){//当前物体注视目标点旋转this.transform.LookAt(targetPoint);}/// <summary>/// 寻路,沿路线(Vector3[])移动/// </summary>/// <returns>返回寻路结果</returns>public bool Pathfinding(){//return false; 到达终点,无需寻路//return true;  需要寻路if (line.WayPoints == null ||currentPointIndex>= line.WayPoints.Length) return false;//如果到达目标点(判断 当前位置 和 目标点之间的距离(Vector3.Distance))//更新目标点(向下一个路点移动)//朝向目标点LookRotation(line.WayPoints[currentPointIndex]);//向前移动MovementForward();if (Vector3.Distance(this.transform.position, line.WayPoints[currentPointIndex])<0.1f){currentPointIndex++;}return true;
}

2.敌人状态信息EnemyStatusInfo类

  • 定义变量:当前生命值,当前生命值
  • 定义方法:受伤,死亡。
/// <summary>
/// 敌人状态信息
/// 定义敌人信息,提供受伤、死亡功能;
/// </summary>
public class EnemyStatusInfo : MonoBehaviour
{public EnemySpawn spawn;//当前血量public float enemyHP = 200;//最大血量public float maxHP = 200;/// <summary>/// 受伤/// </summary>/// <param name="amount">需要扣除的血量</param>public void Damage(float amount){//扣血enemyHP -= amount;//血量为0时,调用死亡方法if (enemyHP <= 0){Deadth();}}//延迟销毁时间public float deathDelay = 5;/// <summary>/// 死亡/// </summary>public void Deadth(){//播放死亡动画var anim = GetComponent<EnemyAnimation>();anim.action.Playing(anim.deathAnimName);//销毁当前物体Destroy(this.gameObject,deathDelay);Debug.Log("我死了");//设置路线状态GetComponent<EnemyMotor>().line.IsUsable = true;//产生下一个敌人spawn.GenerateEnemy();}}

3.敌人动画EnemyAnimation类

  • 定义各种动画名称的变量,如跑步、闲置、攻击。
  • 定义AnimationAction类,提供有关动画的行为。
/// <summary>
/// 敌人动画
/// 定义需要播放的动画名称
/// </summary>
public class EnemyAnimation : MonoBehaviour
{//跑步动画名称public string runAnimName;//攻击动画名称public string attackAnimName;//闲置动画名称public string idleAnimName;//死亡动画名称public string deathAnimName;//行为类public AnimationAction action;public void Awake(){action = new AnimationAction(GetComponentInChildren<Animation>());}
}

4.动画行为类 AnimationAction

/// <summary>
/// 动画行为类
/// 提供有关动画的行为
/// </summary>
public class AnimationAction
{//附加在敌人模型上的动画组件引用private Animation anim;/// <summary>/// 创建动画行为类/// </summary>/// <param name="anim">附加在敌人模型上的动画组件引用</param>public AnimationAction(Animation anim){this.anim = anim;}/// <summary>/// 播放动画/// </summary>/// <param name="animName">需要播放动画的名称</param>public void Playing(string animName){anim.CrossFade(animName);}/// <summary>/// 判断指定动画是否在播放/// </summary>/// <param name="animName">动画名称</param>/// <returns></returns>public bool IsPlaying(string animName){return anim.IsPlaying(animName);}}

5.敌人人工智能EnemyAI

  • 获取[敌人马达、敌人动画]脚本对象引用。
  • 定义枚举:敌人状态State
  • 每帧根据状态,执行寻路或攻击
/// <summary>
/// 敌人AI
/// </summary>
[RequireComponent(typeof(EnemyAnimation))]
[RequireComponent(typeof(EnemyMotor))]
[RequireComponent(typeof(EnemyStatusInfo))]public class EnemyAI : MonoBehaviour
{//定义敌人状态的枚举类型public enum State{Attack,   //攻击状态Pathfinding  //寻路状态}private State currentState = State.Pathfinding;private EnemyAnimation anim;private EnemyMotor motor;private void Start(){anim = GetComponent<EnemyAnimation>();motor = GetComponent<EnemyMotor>();}//攻击计时器private float atkTimer;//攻击间隔private float atkInterval = 2;private void Update(){//判断switch (currentState){case State.Pathfinding:Pathfinding();break;case State.Attack:Attack();break;}}private void Pathfinding(){//播放跑步动画anim.action.Playing(anim.runAnimName);//执行寻路 调用motor类中的寻路方法 //如果寻路结束,修改状态为攻击if (motor.Pathfinding() == false) { currentState = State.Attack; };}private void Attack(){//如果攻击动画没有播放if (anim.action.IsPlaying(anim.attackAnimName) == false){//播放闲置动画anim.action.Playing(anim.idleAnimName);}if (atkTimer <= Time.time){//执行攻击 //播放攻击动画anim.action.Playing(anim.attackAnimName);atkTimer = Time.time + atkInterval;}}
}

敌人生成器

策划

需求分析

1.敌人生成器EnemySpawn类

  • 定义变量
    WayLine[] lines用于存储所有路线
    GameObject[] enemyTyoes用于记录敌人预制件
    int startCount 用于记录开始时需要创建的敌人数量
    int spawnedCount 用于记录已经产生的敌人数量
    int maxCount 用于记录产生敌人数量的上限
    int maxDelay 用于记录产生敌人的最大延迟时间
  • 定义方法
    CalculateWayLines() 用于计算所有路线及坐标
    GenerateEnemy(),用于生成一个敌人
/// <summary>
/// 敌人生成器
/// </summary>
public class EnemySpawn : MonoBehaviour
{public GameObject[] enemyType;//需要创建的敌人最大数目public int maxCount = 5;//开始同时创建的敌人数目public int startCount = 2;//已经创建的敌人数量private int spawnedCount;public int maxDelay = 10;/// <summary>/// 生成一个敌人/// </summary>public void GenerateEnemy(){spawnedCount++;if (spawnedCount>=maxCount){return;}//延迟时间随机Invoke("CreateEnemy",Random.Range(1,maxDelay));}private void CreateEnemy(){//选择一条可以使用的路线//选择所有可以使用的路线WayLine[] usableWayLines = SelectUsableWayLine();//随机选择一条WayLine line = usableWayLines[Random.Range(0, usableWayLines.Length)];int randomIndex = Random.Range(0, enemyType.Length);//创建敌人//Instantiate(敌人预制件,位置,旋转角度);GameObject go = Instantiate(enemyType[randomIndex], line.WayPoints[0], Quaternion.identity) as GameObject;//配置信息EnemyMotor motor = go.GetComponent<EnemyMotor>();motor.line = line;line.IsUsable = false;  //不可以使用//传递生成器对象引用[建议使用委托代替]go.GetComponent<EnemyStatusInfo>().spawn = this;}private void Start(){CalculateWaylines();}private  WayLine[] lines;private void CalculateWaylines(){//路线数组lines = new WayLine[this.transform.childCount];for (int i = 0; i < lines.Length; i++){//每一个路线//路线变换组件的引用Transform wayLineTF = this.transform.GetChild(i);//路点数量int count = wayLineTF.childCount;//创建路线对象lines[i] = new WayLine(count);lines[i].IsUsable = true;//创建路点数组对象lines[i].WayPoints = new Vector3[count];for (int pointIndex = 0; pointIndex < count; pointIndex++){lines[i].WayPoints[pointIndex] = wayLineTF.GetChild(pointIndex).position;}}}/// <summary>/// 选择所有可以使用的路线/// </summary>/// <returns></returns>private WayLine[] SelectUsableWayLine(){List<WayLine> result = new List<WayLine>(lines.Length);//遍历所有路线foreach (var item in lines){//如果可以使用,添加到result中if (item.IsUsable) result.Add(item);}return result.ToArray();}}

2.Wayline类

public class WayLine
{/// <summary>/// 当前路线所有路点坐标/// </summary>public Vector3[] WayPoints { get; set; }/// <summary>/// 是否可用/// </summary>public bool IsUsable { get; set; }public WayLine(int wayPointCount){WayPoints = new Vector3[wayPointCount];IsUsable = true;}}

Unity(3)-“英雄无敌”敌人+敌人生成器模块相关推荐

  1. Unity游戏实战项目-英雄无敌

    敌人模块 策划 需求分析 EnemyMotor.cs EnemyMotor.cs 注意: 1.transform.LookAt(targetPos) 表示当该物体设置了Lookat并指定了目标物体时, ...

  2. android 死亡阴影,英雄无敌3死亡阴影单机版

    英雄无敌3死亡阴影单机版作为<英雄无敌>系列的第三部,游戏中不仅吸收了前作经典的魔幻题材,同时游戏创造性的将dota,lol等众多知名英雄合理的融入到战棋玩法中,让游戏耳目一新,与众不同! ...

  3. 玩家心理角度分析《英雄无敌三》

    从玩家心理角度分析一个游戏的玩点,应该对游戏的艺术风格也作分析. 我把对<英雄无敌三>的分析分为三个部分:艺术分析.初级玩家分析.高级玩家分析. 艺术分析:艺术元素在游戏中表现如何,直接关 ...

  4. C++学习笔记24:多态案例之魔法门英雄无敌

    需求分析: 游戏:魔法门之英雄无敌游戏中有很多种怪物,每种怪物都有一个类与之对应,每个怪物就是一个对象类: CSoldier CDragon CPhonex CAngel怪物能够互相攻击,攻击敌人和被 ...

  5. 中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第六周 多态 笔记 之 多态实例:魔法门之英雄无敌

    第六周 多态 1.虚函数和多态的基本概念 2.多态实例:魔法门之英雄无敌 3.更多多态程序实例 4.多态的实现原理 5.虚析构函数.纯虚函数和抽象类 2.多态实例:魔法门之英雄无敌 游戏中有很多种怪物 ...

  6. 三国志、英雄无敌玩腻了?没关系,我教你开发个战旗游戏玩玩

    喜欢回合制战棋游戏的玩家,肯定对<三国志曹操传>和<英雄无敌>这两款经典战旗游戏不陌生吧. 在<三国志曹操传>中,镇压黄巾军.群雄讨伐董卓.灭吕布等历史事件与游戏中 ...

  7. 英雄无敌3的地图格式分析以及解码方法研究——汇编模拟

    老玩家都知道,英雄无敌3是附带有地图编辑器程序的,但是编辑器保存的地图内容数据是加密存储的格式,所以不能通过修改地图内容来直观的知道具体地图数据格式. 目前笔者通过汇编OllyDbg调试工具获得exe ...

  8. 英雄无敌3版的仙剑奇侠传

    英雄无敌3版的仙剑奇侠传(战役,共8张地图?).     使用方法:复制到英雄无敌3安装目录下的Maps文件夹中,进入 游戏--新游戏--战役--自创战役.     要看仙剑头像的,请把那些*.pcx ...

  9. ubuntu linux下面运行《暗黑破坏神2》和英雄无敌3-死亡阴影

    游戏文件: 链接: https://pan.baidu.com/s/1McfinqGnCZJlaCnll4o2Hw&shfl=shareset 提取码: a55t wine设置参考[2] 自己 ...

最新文章

  1. 保证高可用Java服务化系统高效运行的必备工具箱
  2. Python 2.7.10安装pycurl遇到的问题汇总
  3. Dos批处理中符号作用大全
  4. spark性能优化 -- spark工作原理
  5. C++编程思想:父类函数隐藏
  6. 三行情书代码_用三行代码优化您的交易策略
  7. 跑来跑去:假人与AWS Lambda的第一次接触
  8. 华为鸿蒙5g售价,华为5G新旗舰已确认,双曲面屏+升级到鸿蒙2.0,价格很感人
  9. cocos creator 打包apk_cocos creator android 编译踩坑
  10. 确定了C/C++的学习路线之后,便只能是一条路走到黑了
  11. 吴恩达深度学习之一《神经网络和深度学习》学习笔记
  12. Boolean占几个字节
  13. mysql都有什么基本函数_【第七章】MySQL的基本函数
  14. 信息技术在园林绿化技师试题测试中的应用
  15. 令人耳目一新的人类进化,读《人类简史》有感
  16. 企业邮箱使用安全注意事项
  17. ZYNQ裸板:LHB155304-RT篇
  18. 百度云盘上传显示服务器异常,百度网盘常见问题之网络异常,这里有最全面的解决方法...
  19. 5月最新M1芯片安装PS2021和PS2020已更新M1芯片mac安装PS2021解决教程(附安装方法)
  20. (十三)Java工具类StringUtils中strip、stripStart、stripEnd剥离方法源码详解

热门文章

  1. Datawhale打卡任务 Task 05爬虫入门与综合应用
  2. 在嵌入式Linux上使用CF接口的蓝牙模块
  3. 管张汇泓:一份邮件把我带到了开源世界|OneFlow U
  4. 5月24 文件操作
  5. 【Fluent】导出瞬态计算过程每一秒或每一个时间步的各个坐标/节点的物理量-温度场-压力场,TUI命令/file/export和/file/transient-export
  6. 拳皇(Java简单的小程序)
  7. 从事大数据行业有多少种职位,主要的职责是什么?
  8. 如何用纯 CSS 创作一台拍立得照相机 1
  9. 基于C++代码的UE4学习(四十九)——坦克炮弹类的完整代码
  10. 7.22 第二场 I love 114514