自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 结构体(struct)和类(class)

结构体是值类型:方法调用会复制结构体,导致对成员的修改不会影响原始实例。类是引用类型:方法调用会传递引用,导致对成员的修改会影响原始实例。避免陷阱的方法:使用ref传递结构体,或返回新结构体实例,或优先使用类。理解这些差异和陷阱可以帮助你在设计和使用结构体和类时避免常见错误。

2024-07-17 09:59:41 234

原创 Unity踩坑之RectTransformUtility.ScreenPointToLocalPointInRectangle

假设鼠标点击a物体(都为UI元素,下同),而a物体的父物体为A,如果A相对于Canvas,其锚点在Canvas的中心点,那么使用RectTransformUtility.ScreenPointToLocalPointInRectangle方法,将父物体,鼠标指针位置,渲染Canvas的相机(若为Overly则为null),传入,得到的localPoint就是a的PosX和PosY。如果子物体的父物体的锚点不在中心,可以在子物体上再套一个空物体,将空物体的锚点设为父物体的中心,则完美解决。

2024-07-14 21:36:27 392

原创 Unity Destory的一些坑

Destory并不会在当前帧销毁物体,如果使用Destory来销毁子物体并且马上新生成子物体,那么子物体的GetSiblingIndex()会在旧的子物体的最后一个之后,这时需要延迟一帧执行。

2024-07-05 13:35:10 102

原创 foreach的一些坑(在遍历时修改元素带来的问题)

2024-07-05 13:07:39 132

原创 C#接口一些有意思的东西

说明((ISonA)this)转成了最基础的接口。

2024-07-03 20:20:25 318

原创 C#接口的一些坑

说明:当两个接口同时继承自一个基础接口IBASE时,当一个类A实现其中某一个接口IA时,再用其他类B来继承这个类时,类B所实现的所有基础接口IBASE的接口都被失效(被IA覆盖)当两个接口处于同一级别时,才会正确执行。

2024-07-03 12:42:45 373

原创 Unity踩坑记录

来判断CardGroup相交时碰到了子物体的碰撞体,那么父物体也会调用OnTriggerEnter2D方法。

2024-06-21 23:11:22 337

原创 BlenderToUnity

2024-02-12 12:29:38 92

原创 Animator

获取当前游戏的动作状态,GetCurrentAnimatorStateInfo(层级)比如可以使用:IsName来判断当前动画是是否正在播放,来确定之后该做什么。1.通过参数名称来设置参数,如设置bool类型的。2.通过参数名称来记录参数,如设置bool类型的。

2023-08-10 15:40:00 183

原创 Animation

如果,在快速按下A,B两键时,动画New Animation.anim_2与动画New Animation.anim_1 1的切换就比较丝滑了。在这里可以选择方法,当动画播放到帧事件所在位置时,就会触发对应的方法。其中第一个Animation是物体默认状态下播放的idel ,而Animations是动画列表,可以通过代码来控制其播放。对于两个动画快速的切换,不免会感觉有些突兀,CrossFade方法(类似于淡入淡出效果)可以使得动画圆滑过渡。通过k帧来变化其:缩放/位置/旋转,制作两个动画。

2023-08-07 15:12:52 151

原创 Sorting Layer与Order in Layer

就像是两个数相比,比如34与26,Sorting Layer决定的是十位,而Order in Layer决定的是个位,如果Sorting Layer的级别比较高,则可以忽略Order in Layer的比较,当比较的二者的Sorting Layer级别相同,则Order in Layer才起决定作用。

2023-08-03 17:30:36 243

原创 图片资源

From Gray Scalable:根据RGB均值计算得来的Alpha值。根据不同距离显示不同分辨率的图片,耗费内存,跟3D的LOD功能类似。Input Texture Alpha:自带的Alpha资源。ToNearest:处理图片成为大小最接近2的次方数图片尺寸。ToLarger:图片分辨率按最大尺寸来。Editor GUI:编辑器使用的图片。Cookie:灯光Cookie贴图。Lightmap:灯光贴图。Normal:法向贴图。Cursor:鼠标贴图。None:不对图片处理。

2023-08-03 12:31:26 98

原创 Unity特殊文件夹

2023-08-02 12:29:56 176

原创 yield

等待固定的时间(一般为0.02秒)运行到当前帧最后执行。

2023-08-02 10:47:58 51

原创 延迟函数

发现按下A键使物体失活,延迟函数Invoke仍会执行,但当前脚本或者脚本的游戏物体被销毁时,Invoke不会执行。repeatRate表示重复执行methodName的时间间隔。InvokeRepeating:重复调用Invoke。无参情况下是取消当前代码内所有Invoke函数。time表示多少秒后执行methodName。

2023-08-01 11:09:55 192

原创 Ray

碰撞到的物体的Transform组件。} 碰撞体与射线起始点的距离。} 碰撞点所在碰撞的法向量。} 碰撞点世界坐标系下的坐标。} 碰撞到的物体的刚体。这里的最后一个参数可以设置层级(int型),方法类似于我这一篇讲的Culling Mask。物理射线监测:返回值为bool型,可以确定射线有无碰撞到碰撞体。可知:normal为碰撞到的点所在的面的法向量。

2023-07-30 16:21:02 234

原创 AddForce

VelocityChange:关注的是速度,与质量无关。Acceleration:关注的是加速度,与质量无关。Impulse:关注的是冲量,与质量相关。Force:关注的是力整体。

2023-07-29 19:40:16 318

原创 Camera组件

当给摄像机Target Texture赋值Render Texture时,这个摄像机的Depth会失效,不会和其它摄像机进行对比渲染到主屏幕,而是将当前摄像机拍摄到的画面显示实时到Render Texture上。Clipping Planes/Near,Far:渲染最近/最远的距离,所需渲染的游戏物体需在这个范围内。摄像机先后渲染的级别,可用于多个摄像机叠加(值越大越后渲染,后渲染的画面覆盖先渲染的画面,显示的越靠前):与上期介绍的Light组件中的Culling Mask的效果类似。

2023-07-29 12:11:19 223

原创 Audio Clip

预加载音频资源,如果勾选进入场景就会马上加载,如果不勾选,第一次使用音频时才会加载(进内存)。第一个,以不压缩的形式存在内存,用的时候方便,但是占用的内存高。Vorbis:相对来说压缩的很小,可以调整压缩质量。第三个,以流的的形式存在内存,使用时现解码。ADPCM:脚步声/武器碰撞声等等可以用。多声道强制转为单声道,减小所占内存。aiff/wav:适用于较短声音片段。mp3/OGG:适用于较长的音乐片段。第二个,以以压缩的形式存在内存。PCM:以最高质量进行存储。勾选后会对声音有优化。

2023-07-26 17:23:31 201

原创 四元数

与transform.LookAt类似的是都是将其正方向指向目标方向,但是LookRotation可以做的跟更好。值得注意的是:Unity中组件Transform的Rotation实际上是Quaternion类型的。线性插值,与Mathf.Lerp差不多。值得注意的是:两个四元数相乘。

2023-07-25 20:35:00 240

原创 万向节死锁

要理解万向节死锁的产生原因,首先要理解欧拉角变换,欧拉角变换是基于。为了解决这个问题,四元数就是个很好的方法,下期我将介绍一下四元数。果然,转动Y轴时,视觉看上去却是围绕X轴进行旋转。的坐标进行变换而非变换后的坐标进行变换。在Unity中,变换顺序为Y>Z>X。所以先对Y轴变换,就不会影响Z和X轴。发现物体却是绕Y轴进行旋转,看上去仍是绕Z轴旋转。

2023-07-25 18:43:22 2028

原创 Vector3.Cross

上期介绍了Vector.Dot可以用来判断敌人处于自身的前方or后方,那么这期就是通过叉乘来判断敌人处于自身的左方or右方。可以看到,敌人位于自身右边时(x轴正方向)根据右手定则,叉乘的结果方向向上。根据这个特性,我们可以根据叉乘结果的正负来判断敌人位于自身的左边or右边。将球移动至自身右边时。

2023-07-25 13:13:20 531

原创 Vector3.Dot

a.transform.position这两个向量,当cube(2)在自身(cube)的前方时,其夹角永远小于90°,在后方时,永远大于90°,如此可依据点乘来判断“敌人”相对于自身的位置(前方or后方)这里我将两个向量传入,第一个为cube本身的正方向,第二个为cube指向cube(2)的方向,由于向量点乘等于其各自模长相乘再乘上二者之间的余弦值,所以Vector3.Dot返回值的正负取决于其夹角。如图:cube在cube(2)的前方、

2023-07-25 10:15:45 296

原创 摄像机跟随

transform.forward向量的两个端点其中一个在世界坐标原点,与另一个点的连线与物体自身正方向朝向平行,用这个向量乘一个长度,再与(0,height,0)相加,就可得到想要的目标向量,这个向量n(x,y,z)与物体自身位置相加Target.transform.position(假设为(x1,y1,z1)),则(x+x1,y+y1,z+z1)的向量的端点就是所需的位置。

2023-07-24 17:02:23 62

原创 Mathf.Lerp

其中a,b代表起点和终点的位置,而t表示一个百分数,即插值在a,b之间的位置所占a,b总长的百分比,若t>1,则按1计算。这样可以实现“远快近慢”的效果,理论上a将无限趋近于b但不等于b,可以应用在血条制作,摄像机跟随等方面。第二次:a=position1,position2=(b-a)*t。第三次:a=position2,position3=(b-a)*t。第一次插值位置:position1=(b-a)*t。Lerp函数有三个参数,a,b,t。

2023-07-23 14:06:35 331

原创 ONGUI

说明是以左上角为原点来算的。

2023-07-23 12:10:27 202

原创 Light组件

为3时,设置第二个和第三个同时勾选,也就是Default和TransparentFX(0011)为0时,设置cullingMask勾选第一个,也就是noting,其余不勾选(0000)为1时,设置Default勾选(跳过Everything)(0001)为2时,设置第二个勾选,也就是TransparentFX(0010)这样的好处是可以简便的同时选择多个需选择的层级。可选择图片,光源会以这个图片的样式投影。Direction:直射光(模拟太阳)Area:区域光(渲染用,需烘培)RealTime:实时。

2023-07-22 18:54:18 88

原创 生命周期函数

通过设置空物体是否禁用可以得知,当脚本(或挂载脚本的物体)被禁用/启用时,OnDisable和OnEnable会被调用。经测试:物体在被销毁时,先调用OnDisable,再调用OnDestroy。Update是每帧执行一次,而FixedUpdate是以固定时间执行一次。LateUpdate是在Update执行后执行 ,同样是每一帧都会执行。可以看到FixedUpdate是每0.02s执行一次。加入OnDisable函数。

2023-07-22 12:40:41 52

原创 递归查找子物体(适用于背包系统)

【代码】递归查找子物体(适用于背包系统)

2023-07-22 11:21:36 57

原创 Input类

这样可以通过检测a d键的输入,从而返回一个在-1至1间的浮点值,可以让移动不会显得突兀。同上道理,其中int button代表左键(0),右键(1),中键(2)可以再unity中的Project Settings找到。同上,但只会返回0,-1,1这三个值。按下键后松开按键时调用。

2023-07-21 14:34:02 42

原创 transform.Rotate/Translate/LookAt/SetParent/GetChild/Find和GameObject.Find

查找父物体transform下的子物体,如transform.GetChild(0);为查找transform下的第一个子物体,值得注意的是,GetChild不能查找子物体的子物体。与GetChild类似,根据物体名字进行精确查找,要确保名字不能出错,同样只能查找transform的子物体,而不能查找子物体的子物体。传入欧拉角,旋转相应的度数,默认是自身坐标系(Space.Self)可以更改为世界坐标系(Space.World)游戏物体指向(默认:Vector3.up)另一个游戏物体(target)

2023-07-21 12:56:33 65

原创 unity预制体打包

unity做好的预制体如果给别的工程使用,如果是单纯的ctrlcv会导致丢失引用,如材质信息等,我们可以将其打包好再导入给别的工程。点击Export,选择保存位置。

2023-07-20 16:53:58 286

原创 unity基础

调整摄像机位置至Sence视角:CTRL+shift+f。旋转视角:ALT+左键。

2023-07-20 16:48:12 38

原创 值类型与引用类型

值得注意的是,引用类型存储在内存堆中,而值类型根据声明类型存储在不同的位置,如果作为方法的局部变量则会存储在内存栈中,但作为对象的实例成员会随对象一起存放在内存堆中。常见的值类型:int,long, short, float, double, byte, char, enum, struct......说明st2 = st1;区别:值类型用来存放实际数据,而引用类型用来存放对象引用(并不是对象本身,而是对象在堆内存空间的内存地址)常见的引用类型:字符串, 数组, 类......

2023-07-17 10:37:07 68

原创 unity对象池系统

当游戏场景中出现大量的可重复利用的物体时,通过Destory来销毁再创建会触发不必要的GC回收机制,浪费性能,我们可以利用unity自带的对象池系统,从而节约性能来得到同样的效果。限制对象池的最大容量,防止对象池的无限扩张,如果maxSize已满,当调用Release函数时,这个Release函数将会忽略。为了实现对象池,必须修改一下子弹的脚本,让子弹停留2秒后回收入对象池而非摧毁。对象池的默认容量,和链表或队列类似,当容量不足时会自动扩容。回收对象到对象池时要执行的功能。调出对象池对象时要执行的功能。

2023-07-15 12:24:09 630

原创 unity物理系统

Speculative CCD会根据上一帧的数据来预测并扩大物体的矩形包围盒,在上图中引擎通过扩大包围盒来找到了n1和n2两个碰撞点的法线。于是引擎重新规划了小球即将到达的位置(t2)。但是DCD有一个很大的问题就是快速移动会穿过其它物体,从而逃过碰撞检测,因为我们始终以固定时间步长来更新物理,所以有可能两个物体在前后两帧之间穿过了彼此,但物理引擎并不知情。物理引擎即描述真实世界中物理现象的算法,如刚体物理,软体物理和流体物理,unity本身支持的主要为刚体物理,我们也可以自己编写一些其它的模拟效果。

2023-07-08 12:11:19 574

原创 Unity协程

刚刚我们说到他们的使用是有一定的规则的,那么规则是什么呢,答案是前两种结束协程方法的使用上,如果我们是使用StartCoroutine(string methodName)来开启一个协程的,那么结束协程就只能使用StopCoroutine(string methodName)和StopCoroutine(Coroutine routine)来结束协程。关键字时,系统会自动生成一个继承自IEnumerable的类,并在该类中实现我们所写的逻辑(如MoveNext()等)。

2023-07-03 13:35:47 328

原创 游戏开发日志17(保存技能树信息)

经测试,通过Save/Load按钮,可以正确实现技能树信息存储了,但是会有问题,当保存后继续加点其它技能,再load后,保存后继续加点的其它技能依然显示,经检查数据保存是没有问题的,只是忘了把之后技能的颜色返回原本的灰色,所有我先在Awake中去记录最初的阴影颜色。最开始的想法是这样的:在GameManage中写一个public List<SkillData> skills=new List<SkillData>();与unity中的SkillData资源文件联系起来,在Save类中创建。

2023-06-22 12:19:41 3851 2

原创 游戏开发日志16(技能树下)

由于SkillData中的preSkills[]是用来存放解锁条件的SkillData类型值,其中有个isUnlocked,于是可以写个函数UpGrade,在UpGrade中遍历preSkills来判断是否有isUnlocked为true的,从而进行updateSkill。但是,ScriptableObject并不能保存数据,接下来我将利用PlayerPrefs/二进制 来存储技能树信息,并且开发相应的技能功能。

2023-06-18 16:31:13 110

原创 Blender

远近观察:CTRL+鼠标中键。

2023-06-17 20:55:31 40

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除