Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
Sword_Skill.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sword_Skill : Skill
{
[Header("Skill Info")]
[SerializeField] private GameObject swordPrefab;//sword预制体
[SerializeField] private Vector2 launchDir;//发射方向
[SerializeField] private float swordGravity;//发射体的重力
public void CreateSword()
{
GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);
Sword_Skill_Controller newSwordScript = newSword.GetComponent<Sword_Skill_Controller>();
newSwordScript.SetupSword(launchDir, swordGravity);
}
}
Sword_Skill_Controller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sword_Skill_Controller : MonoBehaviour
{
private Animator anim;
private Rigidbody2D rb;
private CircleCollider2D cd;
private Player player;
private void Awake()
{
anim = GetComponentInChildren<Animator>();
rb = GetComponent<Rigidbody2D>();
cd = GetComponent<CircleCollider2D>();
}
public void SetupSword(Vector2 _dir,float _gravityScale)
{
rb.velocity = _dir;
rb.gravityScale = _gravityScale;
}
}
SkillManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkillManager : MonoBehaviour
{
public static SkillManager instance;
public Dash_Skill dash { get; private set; }
public Clone_Skill clone { get; private set; }
public Sword_Skill sword { get; private set; }
private void Awake()
{
if (instance != null)
{
Destroy(instance.gameObject);
}
else
instance = this;
}
private void Start()
{
dash = GetComponent<Dash_Skill>();
clone = GetComponent<Clone_Skill>();
sword = GetComponent<Sword_Skill>();
}
}
Skill.cs
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
public class Skill : MonoBehaviour
{
[SerializeField] protected float cooldown;
protected float cooldownTimer;
protected Player player;//拿到player
protected virtual void Start()
{
player = PlayerManager.instance.player;//拿到player
}
protected virtual void Update()
{
cooldownTimer -= Time.deltaTime;
}
public virtual bool CanUseSkill()
{
if (cooldownTimer < 0)
{
UseSkill();
cooldownTimer = cooldown;
return true;
}
else
{
Debug.Log("Skill is on cooldown");
return false;
}
}
public virtual void UseSkill()
{
// do some skill thing
}
}
PlayerAnimationTrigger.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)
{
hit.GetComponent<Enemy>().Damage();
}
}
}
private void ThrowSword()
{
SkillManager.instance.sword.CreateSword();
}
}