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

学习游戏制作记录(技能系统)7.24

1.技能系统概念

首先让我们了解一下游戏的技能本质是什么,以投掷剑为例子,当玩家使用这个技能时,首先会播放玩家的动画,随后通过技能脚本创建一个剑的对象,当剑回收时会再次调用脚本,让它朝向玩家飞来并销毁自己,所以我们可以创建一个技能管理器,将我们所有的技能脚本放在这个管理器中。

2.创建玩家管理器

创建PlayerManage脚本:

    public static PlayerManage instance;//单例模式,使用单例模式可以使我们更加方便的找到玩家的组件
public Player player;//只需初始化一次,不需要我们反复用GameObject.Find来寻找玩家组件

    public void Awake()
{
if (instance != null)//确保我们只有一个实例
{
Destroy(instance.gameobject);
}
else
{
instance = this;
}
}

修改SkeletonBattleState脚本:

player =PlayerManage.instance.player.transform;//可以直接获取Player信息

在SkeletonGroundedState脚本中也做同样的修改

创建一个空对象PlayerManage并挂载PlayerManage脚本,指定Player的对象,这样我们就实现了玩家管理器

3.创建技能管理器

创建Skill脚本(所有技能的父类):

    [SerializeField] private float cooldown;
private float coolDownTime;//每个技能都有的冷却时间

    protected virtual void  Update()
{
coolDownTime -= Time.deltaTime;
}

    public virtual bool CanbeUsed()//判断是否可以使用技能
{
if(coolDownTime<0)
{
UseSkill();
coolDownTime = cooldown;
return true;
}

        else
{
Debug.Log("i am in cooldown");
return false;
}
}


    public virtual void UseSkill()//使用技能
{

    }

创建Dash_Skill脚本:

public class Dash_Skill : Skill//继承
{
public override void UseSkill()
{
base.UseSkill();

        Debug.Log("i am clone");//这里仅作调试,具体我们想实现一个冲刺后留下一个可以攻击敌人的幻影


    }
}

创建SkillManage脚本:

public static SkillManage instance;//同样单例模式

    public Dash_Skill dash {  get; private set; }//获取冲刺克隆技能


    public void Awake()
{
if(instance != null)
{
Destroy(instance);
}
else
{
instance = this;
}
}

    private void Start()
{
dash = GetComponent<Dash_Skill>();
}

    }

Player脚本:

我们可以删除这里定义的冲刺冷却时间

修改:

    public void CheckForDashInput()
{
if(isWallDetected())
{
return;
}

        if(Input.GetKeyDown(KeyCode.LeftShift)&&SkillManage.instance.dash.CanbeUsed())//这里调用CanbeUsed即可
{

            dashDir = Input.GetAxisRaw("Horizontal");

            if(dashDir==0)
{
dashDir = facingDir;
}
stateMachine.ChangeState(dashState);
}
}

演示:

http://www.dtcms.com/a/296327.html

相关文章:

  • Selenium基础教程
  • day46.通道注意力
  • Vue2——5
  • set集合(HashSet、LinkedHashSet、TreeSet)
  • MySQL数据库迁移至国产数据库测试案例
  • 二、计算机网络技术——第6章:应用层
  • 深入理解 ThreadLocal:从原理到最佳实践
  • Vue实现地图图片动态轨迹组件,支持放大缩小重置,兼容触摸等
  • Uniapp中使用vue3语法
  • vue3升级了哪些重要功能
  • vite+vue3 工程-SVG图标配置使用指南——vite-plugin-svg-icons 插件
  • pytest中使用skip跳过某个函数
  • 4.1.2 XmlInclude 在 C# 中的作用及示例
  • 【软件与环境】--SSH连接远程服务器工具:FinalShell
  • C语言:详解文件操作
  • 【Java工程师面试全攻略】Day12:系统安全与高可用设计
  • 嵌入式linux I2C 设备开发调试 使用i2cget 工具失败的问题
  • JavaScript性能优化实战指南:从原理到最佳实践
  • Flink-1.19.0源码详解7-Flink集群端调度
  • 跨境支付入门~国际支付结算(区块链篇)
  • jina-embedding-v4 环境搭建全过程
  • 2025年“创新杯”(原钉钉杯) B题 详细建模思路
  • 牛客网刷题进阶挑战VL25——VL49
  • 【Linux网络编程】传输层协议 - UDP
  • 【数据结构初阶】--二叉树(二)
  • M²IV:面向大型视觉-语言模型中高效且细粒度的多模态上下文学习
  • BI 系统数据看板全解析:让数据可视化驱动业务决策
  • ESP32使用 vscode IDF 创建项目到烧录运行全过程
  • C++学习笔记(八:函数与变量)
  • 云原生架构下的服务器运维挑战与解决方案