【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本节实现了一把带雷电攻击的剑,我取名为雷电一心
TunderStrike_Effect.cs
实现逻辑
- 通过继承
ItemEffect
,实现一个在敌人位置生成雷电打击效果的逻辑。 - 生成的雷电效果是一个预制件,使用Unity的
Instantiate
方法动态创建,并在短时间后销毁,模拟雷电打击的瞬间效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//2024年11月8日
[CreateAssetMenu(fileName = "Thunder strike effect", menuName = "Data/Item effect/Thunder strike")]
public class TunderStrike_Effect : ItemEffect
{
[SerializeField] private GameObject thunderStrikePrefab;//定义预制件
public override void ExcuteEffect(Transform _enemyPositon)
{
GameObject newThunderStrike = Instantiate(thunderStrikePrefab,_enemyPositon.position,Quaternion.identity);
Destroy(newThunderStrike, .7f);//防止一直在不消失
}
}
ExcuteEffect()函数里面加了变量,记得改相关引用函数里面的变量
ThunderStrike_Controller.cs
实现逻辑
- 检测雷电打击效果与敌人的碰撞,并确保只有碰到敌人时才执行伤害逻辑。
- 通过访问玩家的状态,调用玩家的
DoMagicDamage()
方法来对敌人造成魔法伤害。 - 该脚本是雷电打击效果的关键部分,通过碰撞机制实现对敌人的伤害处理。
using UnityEngine;
public class ThunderStrike_Controller : MonoBehaviour
{
protected virtual void OnTriggerEnter2D(Collider2D collision)//碰撞处理
{
if (collision.GetComponent<Enemy>() != null)
{
PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();
EnemyStats ememyTarget = collision.GetComponent<EnemyStats>();//获取碰撞到敌人的数据
playerStats.DoMagicDamage(ememyTarget);//造成魔法伤害
}
}
}
PlayerAnimationTriggers.cs
主要更改了for循环下面的if函数
增加武器效果:武器可能会对命中的敌人施加额外的效果(比如状态异常或附加伤害),从而增加攻击的多样性。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAnimationTriggers : MonoBehaviour
{
private Player player => GetComponentInParent<Player>();
private void AnimationTrigger()
{
player.AnimationTrigger();
}
private void AttackTrigger()
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//这行代码在 Unity 中用于检测一个圆形区域内的所有碰撞体,并返回它们的数组。
foreach(var hit in colliders)//foreach循环是一个迭代器,它可以遍历数组、集合、列表、字典等数据结构。攻击到敌人后,调用伤害函数
{
if (hit.GetComponent<Enemy>() != null)
{
EnemyStats _target = hit.GetComponent<EnemyStats>();
player.stats.DoDamage(_target);
ItemData_Equipment weaponData = Inventory.instance.GetEquipment(EquipmentType.Weapon);
if (weaponData != null)
weaponData.Effect(_target.transform);
}
}
}
private void ThrowSword()
{
SkillManager.instance.sword.CreateSword();
}
}
标签:P116,Thunder,void,private,恶魔城,player,雷电,GetComponent,using
From: https://blog.csdn.net/suzh1qian/article/details/143627602