今天在和朋友聊天时,朋友说我变化好大。我电脑上的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 ...
这几天我在试图学习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) - 传 ...