Unity
未读最近有空时在学做怪物AI设计,于是记录一下不规则移动。
怪物AI设计常见思路
目前Unity制作怪物AI主要有两种方案,第一类是有限状态机,之前写过文章介绍过;第二类是行为树,Unity的一个插件。综合对比,状态机纯靠代码实现、是免费的,缺点是状态复杂、比较难以理解,状态多起来的时候会变得比较难以维护;行为树是靠图形化界面+代码实现的,缺点是付费插件、略微耗性能。其实我么手写的有限状态机就是行为树逻辑的体现。有限状态机实现AI移动,我之前已经实现过了(可以参考我前面写的文章);这里我用的行为树,插件可以在论坛aurorayh.asia获取。(仅学习使用)
行为树实现
这里我们自己写一个节点,继承行为树为我们封装好的Action类,EnemyMovementController和EnemyCombatController类是我自己写的,前者提供了SetAnimation方法,用来设置敌人移动速度;后者则是写了个GetAttackCommand方法来接收攻击指令,还有一个SetAttackCommand方法提供给外部、用来分发攻击指令。ExpandClass类是我自己手写的一些方法。我们通 ...
最近在学习Unity程序框架,于是我来记录一下单例模式基类
单例模式基类是什么?就是通过写一个基类脚本、再用其他脚本继承基类脚本实现功能的一种方式,下面是一个简单的基类脚本:
123456789101112131415161718using System.Collections;using System.Collections.Generic;using UnityEngine;public class BassManager<T> where T:class,new(){ private static T instance; //注意这里我们没有私有化构造函数,其实是不必要的,你知道我们在用单例模式就不会new一个实例了。 public static T Instance { get { if(instance == null) instance = new T(); return instance; ...
之前一直想做一款ACT游戏demo,可惜市面上没找到合适的教程。求人求神不如求己,于是我决定自己开发一款ACT游戏demo,于是记录一下自己的思路。
游戏目标
游戏打算从简单开始设计、慢慢变得更复杂,我的目标就是做出类似于《巫兔》这种,仿《只狼》的ACT游戏。
开发记录
1.相机部分。首先是关于相机部分,配上InputSystem,写一个GameInputManager类用于管理我们的输入,把GameInputManager写成一个单例,通过鼠标移动控制相机旋转,同时用athf.Clamp设置相机上下看的范围,写一个方法通过鼠标滚轮控制相机与角色距离,实现玩家移动方向朝向相机。
我觉得后续应该会再写一套相机系统,一套索敌用的。因为《巫兔》里打Boss时,相机是不能旋转的,是固定在角色身后的某一方位的,后续再写这个功能。应该再写一个脚本,动态添加相机系统(因为我要写两套)。
2.角色移动。角色移动我采用的八方向移动+RootMotion,之前踩的坑已经在博客里写过,主要是处理旋转上的逻辑。同时给Animator组件写了个拓展函数,拓展方法AnimationAtTag(string n ...
看到群友提到,于是突然意识到,后天就是2025年了,于是写一写年度总结吧。
总的来说,2024年对我来说还是比较重要的一个年份,从年初到年末自己发生了很多变化,不过这些变化是偏好的:变得更成熟、更冷静了,更加独立了。2024年初的我,总是处在焦虑迷茫、精神内耗中,精神状态和心理状态堪忧——当然这都是年初的事情了。感觉大概10-11月份期间,我就像突然长大了好多岁,已经不会再迷茫、再焦虑、内耗和emo了;我看待事物,也是慢慢有了自己的见解,不是只听别人说。慢慢有了自己的规划和思考,不再“随大流”;我能专心下来做属于我自己的事情,面对问题我也冷静了许多、而不是再逃避。等等许多,让我明显感觉到我的层次貌似又上升了一个阶段。
在知识方面,我24年相比以往还是有很大进步的,我开始认真学习了C#编程语言、在7月份开始自学Unity,并已经坚持到现在了。我的个人博客也发生了很大的变化,以前我喜欢写一些自己的思考、生活的琐事,现在打开基本都是Unity、前端等东西,gal测评都没怎么写过,好处是我什么时候忘了东西、不会了能看我自己写的博客,我完全当成笔记来记录东西。此外,今年还学习了一些go、we ...
起因是某天刷b站,想起来自己还没把up主离忧夏天的C#数据结构看完,结果意外发现了另一位up主木子喵neko,虚拟up+可爱声音讲解数据结构与算法,于是跟着看了。我自身对知识有比较强的分享欲和记录欲(因为我发现我不记笔记总是会忘掉),于是记录一下木子喵算法小课堂第一课:汉诺塔问题。用我最熟悉的C#语言来写。
问题介绍
汉诺塔问题是一个经典的递归问题,源自一个古老的印度传说。在这个问题中,我们有三根柱子和一系列不同大小的圆盘,这些圆盘最初按大小顺序堆叠在一根柱子上。目标是将所有圆盘移动到另一根柱子上,遵循两个规则:一次只能移动一个圆盘,且在移动过程中较大的圆盘不能放在较小的圆盘上面。
***
解题思路
这道题主要思想还是递归(说实话我现在递归还学得挺烂的),我们把柱子做好标记:A柱是起始柱,B柱是中间柱,C柱是目标柱。
形象的图片
我们假设有n个圆盘,从上到下编号为1-n,我们先假设我们通过某种手段,把上面的n-1个圆盘搬到了B柱子,接下来我们把A中剩下的一个盘子搬到了C
那么现在的情况是什么?B柱变成起始柱了,A柱变成中间柱了,按照上面的方法,我们把n-2个圆盘移动到了A柱,B柱剩下 ...
今天在和朋友聊天时,朋友说我变化好大。我电脑上的QQ音乐正好在播放《水仙》专辑的曲子,于是想起了以片冈智为代表的的猫猫社的《水仙》系列作品,对我倒是有一定的影响的。
最先接触《水仙》这部作品,是在一个Q群的精华消息看到:“网页版玩Galgame《水仙》,链接xxxxx”,当时是22年,我读高二,点进去玩。最先多是不太理解,只是能感到作品氛围的悲伤吧,草草玩了第一部作品。
真正开始有所感触、并认真体验《水仙》全系列,是在23年上大学后。当时高考结束,自己在专业上与家里人产生分歧,当时诊出心理疾病、闹得厉害,算是我到现在最不如意的一年。23年经历了很多事,再玩《水仙》时,就很有感触了:对家人的愧疚感、对死亡的不现实感、负罪感等等,算是感同身受。印象深刻的是玩片冈智的小短篇《1980》和《1993》时,因为是片冈智写得确确实实发生在他身边的故事,感觉共鸣感挺强的。
要说我最喜欢的一部,应该是水仙十周年纪念版的《水仙:堇》了吧,这作是最有感触和代入感的一部,因为感觉,故事的主人公高坂堇和我真得太像了,玩起来满是无力感和悲伤吧。当时我状态最差,也经常打开这部作品玩,可以说,高坂堇算是我过去人 ...
本文用于记录伤害检测,算是一套比较完整的伤害检测系统。人物有两个属性,一个是生命值、一个体力值,当体力值小于10时是格挡不了的。那么姑且开始写代码吧。
思路分析
首先我们需要做伤害判定——判断敌人是否受伤害,那就用Physics.SphereCast方法,角色往前一段距离进行一个碰撞检测,声明一个Transform变量currentEnemy = hit.collider.transform,用来保存敌人数据。如果检测到了,并且我们进行了攻击,就可以执行敌人受伤或是格挡的逻辑了。
在写逻辑前,我们可以优化一下,一般游戏都有锁敌机制。我们也写一套锁敌机制,锁敌机制判断条件有二,一是敌人和我们的距离小于1.3,二是敌人在我们前方60度的角度内可以索敌。距离判断很简单,直接Vector3.Distance().magnitude就可以了;角度判断用Vector3.Dot(this,transform.forwar,(currentenemy.transform.position - this.transform.position)),返回一个float值,当其大于根号3/2时可以索敌(点积的 ...
今天上b站,看到了up主NowPaper老师关于Unity连招的思路,觉得代码写得很简洁、同时实现了预输入,觉得很有借鉴意义。
思路介绍
NowPaper老师整体的思路是,先声明InputType来存储输入类型,InputType == 1为轻击输入、InputType == 2为重击输入,结合InputSystem来判断输入类型。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778//声明两个数组来存储轻击和重击动画//这点我觉得其实鬼鬼鬼ii做的简单技能编辑器效果要更好,关于技能编辑器参考我的文章“Unity基础连招思路”public AnimationClip[] Attack1Clips;public AnimationClip[] Attack2Clips;......//以下是根据InputSystem配置好的,判断攻击类型的。in ...
今天试着自己实现了简单的连招系统,先来介绍一下该系统的逻辑:角色按左键是轻攻击、右键是重攻击,重攻击四组、轻攻击三组动画。根据轻攻击连按次数+右键的点击打出不同的重攻击。
技能编辑器
首先做一个最基础的属性编辑器,用ScriptableObject做,为每一个攻击动画配置好我们需要的参数:
1234567891011121314151617using UnityEngine;[CreateAssetMenu(fileName = "ComboData", menuName = "Scriptable Objects/ComboData")]public class ComboData : ScriptableObject{ [SerializeField, Header("招式名称")] private string comboName; [SerializeField, Header("招式伤害")] private int comboDamage; [SerializeFi ...
如今的Unity提供官方写好的缓存池,但我还是打算讲讲自定义缓存池怎么写。
缓存池用途
在射击游戏中,游戏中存在着频繁的子弹创建和销毁工作。如果内存大量频繁地创建和销毁物体,势必会带来很明显的卡顿和性能开销。游戏开发者思考,我是不是可以重复利用固定几个物体、减少内存浪费和性能开销?于是有了缓存池。
思路
以射击游戏为例,先去思考怎么实现子弹缓存效果,我的想法是,场上能看见的子弹也就五、六个,射出去的子弹超出玩家视野后、进行重复利用。于是分类:子弹类——子弹1、子弹2、子弹3、子弹4...
然而缓存池不一定只有子弹类,可能还有炮弹类、垃圾类等等,最后划分大概是这样的一张图表:
物体
子弹类
炮弹类
垃圾类
...
子弹二
炮弹二
垃圾二
...
子弹三
炮弹三
垃圾三
...
这就类似于我们的衣柜,衣柜里有不同的抽屉,每个抽屉里放着不同的衣服,于是联想到字典和List,用Dictionary<string,Queue>来存储
1234567891011121314151 ...