今天试着自己实现了简单的连招系统,先来介绍一下该系统的逻辑:角色按左键是轻攻击、右键是重攻击,重攻击四组、轻攻击三组动画。根据轻攻击连按次数+右键的点击打出不同的重攻击。
技能编辑器
首先做一个最基础的属性编辑器,用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 ...
这几天我在试图学习Unity里的动作系统,了解到“有限状态机”这个东西,之前一直有听说过,以前总感觉很高大上,花了一节水课的时间大概弄懂了,于是分享一下。
温馨提示:在开始阅读本文之前,请确保你了解C#语言中接口、继承、抽象类等相关知识点,否则可能会看不懂)。
什么是有限状态机?
对于玩家和怪物,总会存在几个状态:比如待机、跑步、攻击、巡逻...这些都可以称之为状态。我们在Unity开发中最常接触的有限状态机就是我们的Animator窗口——它就是一个有限状态机。
使用有限状态机,可以更方便我们去进行人物行为动作管理和逻辑管理,比如玩家处于待机状态,按下W键切换到跑步状态、跳跃时进入跳跃状态,我们把不同状态用状态机进行管理,就会好很多。
通用的有限状态机框架
在我观看数位、海内海外的博主的视频,发现他们都会采用同一套框架,逻辑、代码都是极其相似的,于是进行总结。
首先我们新建一个名为IState.cs:
12345678using UnityEngine;public interface IState{ public void Enter(); public v ...
本版本是对有限状态机的优化,并讲了有限状态机的具体使用,要比之前的版本更好。主要是借鉴了博主向宇it的文章。
一、编写框架
首先我们新建一个Parameter.cs,用于存储我们怪物的各种参数,比如动画啊、伤害啊,并加上[Serializable]属性使其可以编辑。
1234567891011[Serializable]public class Parameter{ //定义我们需要的参数 public Animator animator; public float attack; public NavMeshAgent nav; public AnimatorStateInfo animatorStateInfo;//当前动画信息 public float idleTime; public Transform targetObj;}
之后写一个IState.cs脚本,我们所有的状态都要继承它,相等于一个规范
12345678public abstract class IState{ protected ...
今天做ACT小demo时,打算给角色做一个八方向移动+跟随相机旋转的功能,结果遇到神奇的bug:按下s键时、角色旋转180度面向摄像机倒着跑,按下ad键则是旋转90度。先展示我的代码,大家可以看看,能不能看出来我的bug
12345678910111213private void CharacterRotation(){ //防止其他动作、如受伤也旋转 if (_HasInput && animator.AnimationAtTag("Move")) { //获得目标旋转角度 playerRotation = cameraTrans.eulerAngles.y + Mathf.Atan2(Speed.x,Speed,y) * Mathf.Rad2Deg; //过渡一下 float rotation = Mathf.SmoothDampAngle(this.transform.eulerAngles.y, playerRotation, ref curren ...
最近想试着制作ACT游戏demo,然而困难很多,总结下原因:要求太高,第一个demo就想做出功能丰富的战斗系统;基础不牢固,一些基础东西总忘记。这时候打开steam上的游戏巫兔,有所感悟。
《巫兔》这款游戏是个二次元萌化版ACT游戏,整体来看其实游戏逻辑并不复杂,但是口碑却很好。拆解来分析,首先是很简单的相机系统,相机看向角色、角色能跟随相机旋转,也没有鼠标滚轮控制距离、上下移动鼠标改变视角等。其次是动画系统,玩家的动画并不复杂,待机、四个闪避动画、两段攻击动画、一个跳跃动画、一个格挡动画、一个受伤动画和死亡动画,还有一个吃药的动画,游戏进行时玩家始终看向Boss。要说巫兔不足,和一些高级的游戏比起来肯定有很多:相机太死板、角色动画太单一,等等;但其能有好的口碑,关键在于它的攻击系统做得很好、这一两点抹去了所有的不足。于是我思考,我的ACT小demo不一定要做的很复杂,可以参考巫兔,做得简单些。
由于我发现我经常记不牢这些API还经常搞混,于是总结一下
Quaternion
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253在Unity中,`Quaternion` 类用于表示三维空间中的旋转。以下是你提到的API的传入参数和返回值的总结:1. Quaternion.Euler(Vector3) - 传入:一个 `Vector3` 对象,表示绕x、y、z轴的旋转角度(以度为单位)。 - 返回值 :一个新的 `Quaternion` 对象,表示由这些欧拉角定义的旋转。2. Quaternion.AngleAxis(float, Vector3) - 传入 :旋转角度(以度为单位)和一个 `Vector3` 对象,表示旋转轴。 - 返回值 :一个新的 `Quaternion` 对象,表示围绕给定轴的旋转。3. Quaternion.FromToRotation(Vector3, Vector3) - 传 ...
今天花3小时写了个简单的音量控制器,还是参考唐老狮的视频…不管怎么说也是写出来了,感觉理论到实践还是挺难的,经常出Bug,于是记录一下思路和踩的坑。
整体思路
打算先写好BaseUI和UIManager两个脚本(另一篇文章有写UI管理器逻辑),然后写好BeginPanel和SetPanel;音乐部分首先写一个GameDataMgr作为游戏数据管理器,写一个MusicData记录初始数据,在场上创建空物体BKMusic挂载AudioSource脚本控制音乐播放,给SetPanel写一个同样名字的脚本。创建一个Main的空物体,挂载Main.cs脚本,Main.cs里调用UIManager的逻辑使BeginPanel刚开始运行时就出现。
大体流程是,运行项目,首先Main.cs调用UIManager.Instance.ShowPanel();我们点击设置按钮、会调出SetPanel,点击SetPanel右上角叉号会隐藏并在场景删除SetPanel;BKMusic向外部提供方法控制身上AudioSource组件的mute和volumn
踩坑记录
1.未能实例化出物体。运行好几次,总告诉我未 ...
这月要开始备战期末考试了,尤其是系统解剖,因此没太多时间学习Unity,本次记录UI管理器。
思路记录
首先需要想,我们如何去做UI管理器?根据我对“面向对象编程”的思考,我们需要找到不同的UI的共同点——它们都有一个ShowPanel(显示面板)和HidePanel(隐藏面板)的方法,这是共同性;它们的差异性在于不同UI逻辑不同,那就用抽象方法,根据具体差异书写不同逻辑。
其次,UI管理器只能有一个,那就想到了单例模式。我们把不同UI做成预设体存在Resources文件夹,通过单例模式+泛型实现显示面板、隐藏面板的方法:ShowPanel,ShowPanel,这样就很方便。
于是我们需要写两个基础的脚本,第一个是BasePanel,所有UI面板的基类,并声明为抽象类:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061using Unity.VisualScripting;using UnityEngin ...
galgame
未读light.vn引擎是日本游戏开发者BerserkD开发的游戏引擎(作者本人在b站有账号),采用C++语言开发,主要用于视觉小说游戏开发,也可以用来开发一些简单的RPG游戏和3D游戏,开发时间已有10年有余。
目前该引擎国内开发者很少(国内貌似renpy引擎更主流些),据我所知(讲述历史):某天群友购买了《Clear Rain》这款同人游戏想要我做AI补丁,我发现该游戏是用Light.VN引擎开发的,于是自学了两星期、在b站写教程(由于我大号被封禁了、稿件也失效了),随后用该引擎开发了同人性质的小游戏(源码链接:https://www.123865.com/s/RP16Vv-IYtW,可以参考学习)。之后我在网上结识了另一位Light.VN使用者xiakk,我去youtube找到作者BerserkD账号、建议其注册B站账号。目前主要是xiakk与Light.VN引擎开发者联系比较密切,xiakk也在进行Light.VN的汉化工作(github项目:https://github.com/xiakkto/Light.vn-Chinese-Wiki/wiki),并建设了QQ群(909636 ...