Unity类银河恶魔城学习记录5-1.5-2 P62-63 Creating Player Manager and Skill Manager源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class PlayerManager : MonoBehaviour
{
public static PlayerManager instance;
public Player player;//这是通过在外部设置了一个组件,让这个组件能够直接把Player找到,从而减少FInd的方式所带来的高负载
private void Awake()
{
if(instance != null)
{
Destroy(instance.gameObject);
}
else
instance = this;
}
}
SkillManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkillManager : MonoBehaviour
{
public static SkillManager instance;
private void Awake()
{
if (instance != null)
{
Destroy(instance.gameObject);
}
else
instance = this;
}
}
SkeletonGroundState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkeletonGroundState : EnemyState
{
protected Enemy_Skeleton enemy;
protected Transform player;
public SkeletonGroundState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName,Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Enter()
{
base.Enter();
player = PlayerManager.instance.player.transform;
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
if(enemy.IsPlayerDetected()||Vector2.Distance(enemy.transform.position,player.transform.position)<2)
{
stateMachine.ChangeState(enemy.battleState);
}
}
}
SkeletonBattleState.cs
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
//从ground进来的
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位置
player = PlayerManager.instance.player.transform;
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
//退出此状态的方式
if(enemy.IsPlayerDetected())
{
stateTimer = enemy.battleTime;
if (enemy.IsPlayerDetected().distance < enemy.attackDistance)//当距离小于攻击距离,变为攻击状态
{
if (CanAttack())
stateMachine.ChangeState(enemy.attackState);
}
}
else//当没有看见player后,才会根据没有看到的时间来使其退出battle状态
{
if(stateTimer < 0||Vector2.Distance(player.transform.position,enemy.transform.position)>7)//根据距离来判断是否结束battle状态
{
stateMachine.ChangeState(enemy.idleState);
}
}
//下面为移动方向设置
if(player.position.x > enemy.transform.position.x)//在右,向右移动
{
moveDir = 1;
}
else if(player.position.x<enemy.transform.position.x)//在左,向左移动
{
moveDir = -1;
}
if(Vector2.Distance(player.transform.position,enemy.transform.position)>1)
enemy.SetVelocity(enemy.moveSpeed * moveDir, rb.velocity.y);
else
{
enemy.SetZeroVelocity();
}//我自己设置了一个敌人接近一定距离就停下来的设置,防止出现敌人乱晃的情况
}
private bool CanAttack()
{
if(Time.time > enemy.lastTimeAttacked + enemy.attackCooldown)
{
enemy.lastTimeAttacked = Time.time;
return true;
}
return false;
}
}