Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
IceAndFire_Controller.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IceAndFire_Controller : ThurderStrike_Controller
{
protected override void OnTriggerEnter2D(Collider2D collision)
{
base.OnTriggerEnter2D(collision);
}
}
ThurderStrike_Controller.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ThurderStrike_Controller : MonoBehaviour
{
protected virtual void OnTriggerEnter2D(Collider2D collision)
{
if(collision.GetComponent<Enemy>()!= null)
{
PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();
EnemyStats enemyTarget = collision.GetComponent<EnemyStats>();
playerStats.DoMagicaDamage(enemyTarget);
}
}
}
IceAndFire_Effect.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Ice and Fire effect", menuName = "Data/Item effect/Ice and Fire")]
public class IceAndFire_Effect : ItemEffect
{
[SerializeField] private GameObject iceAndFirePrufab;
[SerializeField] private float xVelocity;
public override void ExecuteEffect(Transform _respawPosition)
{
Player player = PlayerManager.instance.player;
bool thirdAttack = player.GetComponent<Player>().primaryAttack.comboCounter == 2;//设置第三下平a产生火球
if (thirdAttack)//设置第三下平a产生火球
{
GameObject newIceAndFire = Instantiate(iceAndFirePrufab, _respawPosition.position, player.transform.rotation);//使火球旋转方向与player对齐
newIceAndFire.GetComponent<Rigidbody2D>().velocity = new Vector2(xVelocity*player.facingDir,0);//获得速度并使其朝向与player一致
Destroy(newIceAndFire, 10);// 自动销毁10秒
}
}
}
ThurderStrike_Effect.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Thurder strike effect", menuName = "Data/Item effect/Thurder strike")]
public class ThurderStrike_Effect : ItemEffect
{
[SerializeField] private GameObject thurderStrikePrefab;
public override void ExecuteEffect(Transform _enemyPosition)
{
GameObject newThurderStrike = Instantiate(thurderStrikePrefab,_enemyPosition.position,Quaternion.identity);
Destroy(newThurderStrike, 1);
}
}
PlayerPrimaryAttack.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerPrimaryAttackState : PlayerState
{
//p38 2.从ground进入
public int comboCounter { get; private set; }
private float lastTimeAttacked;//距离上一次攻击的时间
private float comboWindow = 2;//可以间隔的时间
public PlayerPrimaryAttackState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
xInput = 0;//修复攻击乱转的问题
if(comboCounter >2||Time.time>comboWindow+lastTimeAttacked)//当计数器超过2和间隔时间大于window时,进入第一个攻击动作
{
comboCounter = 0;
}
player.anim.SetInteger("ComboCounter", comboCounter);//设置animtor里的comboCounter
#region 选择攻击方向
float attackDir = player.facingDir;
if(xInput != 0)
{
attackDir = xInput;
}
#endregion
//使其能改变攻击方向
player.SetVelocity(player.attackMovement[comboCounter].x * attackDir, player.attackMovement[comboCounter].y);//给角色初速度,让角色在攻击触发时移动一点
stateTimer = .1f;
}
public override void Exit()
{
base.Exit();
player.StartCoroutine("BusyFor", .15f);
comboCounter++;
lastTimeAttacked = Time.time;
}
public override void Update()
{
base.Update();
if(stateTimer<0)
{
player.SetZeroVelocity();
}//1.修改移动时攻击时后可以移动的BUG
//2.但给了点时间模拟惯性可以动一点
if (triggerCalled)
{
stateMachine.ChangeState(player.idleState);
}
}
}
PlayerAnimationTrigger.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerAnimationTriggers : MonoBehaviour
{
private Player player => GetComponentInParent<Player>();//获得夫组件上的实际存在的Player组件
private void AnimationTrigger()
{
player.AnimationTrigger();
}
private void AttackTrigger()
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//创建一个碰撞器组,保存所有圈所碰到的碰撞器
//https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Physics2D.OverlapCircleAll.html
foreach(var hit in colliders)//https://blog.csdn.net/m0_52358030/article/details/121722077
{
if(hit.GetComponent<Enemy>()!=null)
{
EnemyStats _target = hit.GetComponent<EnemyStats>();
if(_target != null)//修复无敌人时触发DoDamge出错的bug
player.stats.DoDamage(_target);//提供一个可以从player调用敌人受伤函数的入口,通过传入受伤敌人的组件
if(Inventory.instance.GetEquipment(EquipmentType.Weapon) != null)
Inventory.instance.GetEquipment(EquipmentType.Weapon).Effect(_target.transform);
// hit.GetComponent<Enemy>().DamageImpact();
}
}
}
private void ThrowSword()
{
SkillManager.instance.sword.CreateSword();
}
}