自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 BlenderToUnity

2024-02-12 12:29:38 81

原创 Animator

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

2023-08-10 15:40:00 156

原创 Animation

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

2023-08-07 15:12:52 139

原创 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 205

原创 图片资源

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 92

原创 Unity特殊文件夹

2023-08-02 12:29:56 169

原创 yield

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

2023-08-02 10:47:58 40

原创 延迟函数

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

2023-08-01 11:09:55 187

原创 Ray

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

2023-07-30 16:21:02 229

原创 AddForce

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

2023-07-29 19:40:16 311

原创 Camera组件

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

2023-07-29 12:11:19 211

原创 Audio Clip

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

2023-07-26 17:23:31 196

原创 四元数

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

2023-07-25 20:35:00 225

原创 万向节死锁

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

2023-07-25 18:43:22 1626

原创 Vector3.Cross

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

2023-07-25 13:13:20 408

原创 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 232

原创 摄像机跟随

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 56

原创 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 282

原创 ONGUI

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

2023-07-23 12:10:27 193

原创 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 75

原创 生命周期函数

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

2023-07-22 12:40:41 45

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

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

2023-07-22 11:21:36 52

原创 Input类

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

2023-07-21 14:34:02 33

原创 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 55

原创 unity预制体打包

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

2023-07-20 16:53:58 235

原创 unity基础

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

2023-07-20 16:48:12 32

原创 值类型与引用类型

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

2023-07-17 10:37:07 66

原创 unity对象池系统

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

2023-07-15 12:24:09 624

原创 unity物理系统

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

2023-07-08 12:11:19 509

原创 Unity协程

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

2023-07-03 13:35:47 294

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

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

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

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

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

2023-06-18 16:31:13 100

原创 Blender

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

2023-06-17 20:55:31 36

原创 游戏开发日志15(技能树上)

这样,当鼠标点击button时,SkillManage.instance.activeSkill=skillData;可以由activeSkill接收到所点击的图片的SkillData类型的数据,再用DisPlaySkillInfo函数把activeSkill的信息提取到介绍的UI上。如图每张图片都是个button,并添加上SkillButton脚本,给每个SkillButtonn脚本赋上SkillData类型的值。之后是点击让技能信息显示,创建SkillManage脚本,将其挂载在一个空物体上。

2023-06-16 21:06:04 120

原创 GIT命令总结

git remote add origin 远程仓库地址 :给仓库起别名。git push -u origin 分支名称 :向远程仓库推送分支代码。git merge 要合并的分支 :分支合并(可能发生冲突)git clone 远程仓库地址 :克隆远程仓库代码。git pull origin 分支名称 :更新代码。git branch -d 分支名称 :删除分支。git checkout 分支名称 :切换分支。git branch 分支名称 :创建分支。git branch :查看分支。

2023-06-13 19:10:15 40

原创 游戏开发日志14(利用二进制来存储数据)

现在就创建好了一个Data.text的二进制文件来存放Save类的数据,读取也是类似的操作,由于我的这个游戏击败了敌人敌人不会消失而是变换状态,所以在save前判定broke为false时(被击败),不做操作,在save后判定broke为false时,说明save前为true,这样就执行销毁(save后的broken为false状态),重新生成一个(broken为true的状态)。首先,我想要存储敌人的位置信息,且当我消灭了敌人时(save之后),load依然能使它出现在预期位置,并且状态正确。

2023-06-11 11:13:51 741

原创 GIT版本控制

可以通过git commit -m ‘版本名’ 来创建一个版本。依提示输入后,即可通过git commit -m ‘版本名’来创建,这里我创建了一个v1的版本。刚才我从v2回滚到v1了,但现在通过git log只能看到v1了,如何重新回滚至v2呢。也可以通过git add . 来把所有工作区的文件加入暂存区,注意 . 后面有个空格。由于这两个文件均被版本控制了,均已进入了版本库,再查看status时如下。检测到了文件夹中的两个文件,此时它们还处于工作区,为红色。通过git log可以查到每个版本的版本号。

2023-06-09 18:39:05 300

原创 游戏开发日志13(利用PlayerPrefs来存储数据)

这里使用rubby.transform.position=new Vector2(position.x,position.y);来修改位置信息是个不错的选择,因为rubby.transform.position是不能被修改的。其中PlayerPrefs这个静态类,可以通过键值对来存储整数,如PlayerPrefs.SetInt("BGM",0)中,BGM为键名,0为要存入键的值。为游戏设置一个音量键,可以自由选择背景音乐是否开启,并且保存这个设置。其中BGM为Toggle,其余四个为Button。

2023-06-08 19:24:17 282

原创 设计登入界面

由于在输入框中输入的内容在Input Field中的Text里也会同步,根据这个特点可以通过脚本来获取其中的Text组件,从而去作判断。可在Content Type中更改为Password,这样输入的内容就会被*替代。接下来主要实现有:判断用户的用户名和密码,如果正确则跳转场景,不正确则给出提示。在unity中给上面两个public赋值,就可以根据账号密码登入了。设计登入主要是用到了Input Field。

2023-06-02 17:38:39 98

原创 设计关卡UI(滑动页面设计)

另外,调Grid Layout Group不要根据感觉拖,还是规定好整数值比较好,Cell Size里的X和Y代表其图片外圈网格的长宽,Spacing是其网格之间的距离,看了看还是每张图片调整为180/140 ,如此我想要做一个有4页,每页两行,每行4个的网格,就能准确的算出其Grid的Width为180*4*4=2880,Height为140*2=280.接下来做遮罩部分,需要添加一个Mask组件,但是Mask组件需要配合Image来使用(Image用作限定非Mask范围,非Image的地区将被遮罩)

2023-06-01 12:29:55 149

空空如也

空空如也

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

TA关注的人

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