当前位置: 首页 > news >正文

Unity类银河恶魔城学习记录3-4 EnemyBattleState P50

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;public class Enemy : Entity
{[SerializeField] protected LayerMask whatIsPlayer;[Header("Move Info")]public float moveSpeed;public float idleTime;[Header("Attack Info")]public float attackDistance;#region 类public EnemyStateMachine stateMachine;#endregionprotected override void Awake(){base.Awake();stateMachine = new EnemyStateMachine();}protected override void Start(){base.Start();}protected override void Update(){base.Update();stateMachine.currentState.Update();//Debug.Log(IsPlayerDetected().collider.gameObject.name + "I see");//这串代码会报错,可能使版本的物体,因为在没有找到Player的时候物体是空的,NULL,你想让他在控制台上显示就报错了}public virtual RaycastHit2D IsPlayerDetected() => Physics2D.Raycast(wallCheck.position, Vector2.right * facingDir, 50, whatIsPlayer);//用于从射线投射获取信息的结构。//该函数的返回值可以变,可以只返回bool,也可以是碰到的结构protected override void OnDrawGizmos(){base.OnDrawGizmos();Gizmos.color = Color.yellow;Gizmos.DrawLine(transform.position, new Vector3(transform.position.x + attackDistance * facingDir, transform.position.y));}
}

Enemy_Skeleton.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditorInternal;
using UnityEngine;public class Enemy_Skeleton : Enemy
{#region 类Statepublic SkeletonIdleState idleState { get; private set; }public SkeletonMoveState moveState { get; private set; }public SkeletonBattleState battleState { get; private set; }#endregionprotected override void Awake(){base.Awake();idleState = new SkeletonIdleState(this, stateMachine, "Idle", this);moveState = new SkeletonMoveState(this,stateMachine, "Move", this);battleState = new SkeletonBattleState(this, stateMachine, "Move", this);}protected override void Start(){base.Start();stateMachine.Initialize(idleState);}protected override void Update(){base.Update();}
}

EnemyState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EnemyState
{protected Enemy enemyBase;protected EnemyStateMachine stateMachine;protected Rigidbody2D rb;//小简化protected bool triggerCalled;private string animBoolName;protected float stateTimer;public EnemyState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName){this.enemyBase = _enemyBase;this.stateMachine = _stateMachine;this.animBoolName = _animBoolName;}public virtual void Enter(){triggerCalled = false;enemyBase.anim.SetBool(animBoolName, true);rb = enemyBase.rb;//小简化}public virtual void Update(){stateTimer -= Time.deltaTime;}public virtual void Exit(){enemyBase.anim.SetBool(animBoolName, false);}}

SkeletonGroundState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkeletonGroundState : EnemyState
{protected Enemy_Skeleton enemy;public SkeletonGroundState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName,Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName){enemy = _enemy;}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();if(enemy.IsPlayerDetected()){stateMachine.ChangeState(enemy.battleState);}}
}

SkeletonIdleState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkeletonIdleState : SkeletonGroundState
{public SkeletonIdleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName, _enemy){}public override void Enter(){base.Enter();stateTimer = enemy.idleTime;}public override void Exit(){base.Exit();}public override void Update(){base.Update();if(stateTimer < 0){stateMachine.ChangeState(enemy.moveState);}}
}

SkeletonMoveState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkeletonMoveState : SkeletonGroundState
{public SkeletonMoveState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName, _enemy){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();enemy.SetVelocity(enemy.moveSpeed * enemy.facingDir, rb.velocity.y);if(enemy.IsWallDetected()||!enemy.IsGroundDetected())//当撞墙或者没有路的时候翻转{enemy.Flip();stateMachine.ChangeState(enemy.idleState);}}
}

SkeletonBattleState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkeletonBattleState : EnemyState
{private Transform player;//用于给Player定位,好判断怎么跟上他private Enemy_Skeleton enemy;private int moveDir;public SkeletonBattleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName,Enemy_Skeleton _enemy ) : base(_enemyBase, _stateMachine, _animBoolName){enemy = _enemy;}public override void Enter(){base.Enter();player = GameObject.Find("Player").transform;//全局找Player位置}public override void Exit(){base.Exit();}public override void Update(){base.Update();if(enemy.IsPlayerDetected().distance < enemy.attackDistance){Debug.Log("I Attack");enemy.ZeroVelocity();return;}if(player.position.x > enemy.transform.position.x){moveDir = 1;}else if(player.position.x<enemy.transform.position.x){moveDir = -1;}enemy.SetVelocity(enemy.moveSpeed * moveDir, rb.velocity.y);}
}

 

相关文章:

  • 服务器托管有哪些好处?
  • 大华 DSS 数字监控系统 attachment_getAttList.action SQL 注入漏洞复现
  • Stable Diffusion 模型下载:Schematics(原理图)
  • 父类之王“Object”类和内部类
  • JVM Java虚拟机入门指南
  • Android Studio从零基础到APP上线(3)
  • MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程
  • 分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目MySQL数据库版)
  • 树莓派智能自行车灯:亲,小心后方大卡车~
  • 假期2.6
  • Android11+ 如何获得外部存储权限
  • 亚信安慧AntDB领航分布式数据库的突破之路
  • 【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行2
  • 计算已知经纬度的两点距离(两种方法GeoTools和Haversine公式)
  • 《低功耗方法学》翻译——第八章:低功耗IP设计
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Django 博客开发教程 16 - 统计文章阅读量
  • HTTP中GET与POST的区别 99%的错误认识
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode算法系列_0891_子序列宽度之和
  • Terraform入门 - 3. 变更基础设施
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • web标准化(下)
  • 分布式事物理论与实践
  • 经典排序算法及其 Java 实现
  • 入门级的git使用指北
  • 微信开放平台全网发布【失败】的几点排查方法
  • 温故知新之javascript面向对象
  • 项目实战-Api的解决方案
  • 数据库巡检项
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​什么是bug?bug的源头在哪里?
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $(function(){})与(function($){....})(jQuery)的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2)nginx 安装、启停
  • (Java数据结构)ArrayList
  • (Matlab)使用竞争神经网络实现数据聚类
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (独孤九剑)--文件系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)SpringBoot3---尚硅谷总结
  • .net生成的类,跨工程调用显示注释
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] 继承
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]如何调试Native memory crash issue
  • [bzoj1324]Exca王者之剑_最小割
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [HackMyVM]靶场 Wild