Unity
文章平均质量分 60
Unity技巧
Thinbug
精雕细琢,匠心之道.
展开
-
Unity Timeline学习笔记(5) - 自定义轨道切片上变量Transform对象丢失,使用ExposedReference来解决。
我在中后来又引用了Hierarchy中的Transform对象Transform obj,发现一些问题。要么无法拖入进去对象,要么拖入进去保存后,再次编辑或者运行的时候发现obj丢失了。我们还是用修改下笔记(4)的部分代码来解决。"玩家固定(Transform)Clip""固定玩家的Transform""结束后返回原始位置"我们需要把面板值加上ExposedReference来添加引用。然后创建的时候通过fixedTransform.Resolve来赋值就可以了。原创 2024-04-30 16:48:42 · 202 阅读 · 0 评论 -
Unity Timeline学习笔记(4) - 自定义轨道OnCreateClip和CreateTrackMixer用法上的区分
前面我们第二篇文章是一个初步的PlayableTrack使用方法,有时候可能会个性化定制专属轨道。原创 2024-04-26 15:21:02 · 693 阅读 · 1 评论 -
Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道
我们创建一个普通的接收脚本。Debug.Log("接收到信号"+sig);然后我们建立两个接收器来接收这两个信号。这里就是比较麻烦的地方,因为int参数是在接收脚本上的,所以需要两个接收。原创 2024-03-14 11:59:28 · 829 阅读 · 0 评论 -
Unity Timeline学习笔记(2) - PlayableTrack
我们运行看看这些函数是如何触发的。我们看到在编辑器运行后,首先进入的就是OnGraphStart和OnBehaviourPause。当播放到脚本块后,刚进入就进入了OnBehaviourPlay,当播放出了脚本块后会调用OnBehaviourPause,当整个Timeline结束后会调用到OnGraphStop。基本上都很好理解,只有这个OnBehaviourPause比较特殊,相当于Timeline在调用播放激活的时候会调用一次,不管是不是在当前滑块范围内(滑块在第一帧)。原创 2024-03-14 10:28:42 · 576 阅读 · 0 评论 -
Unity Timeline学习笔记(1) - 创建TL和添加动画片段
Timeline在刚出的时候学习了一下,但是因为一些原因一直都没用在工作中使用。版本也迭代了很久不用都不会用了,抽时间回顾和复习一下,做一个笔记后面可以翻出来看。原创 2024-03-14 09:36:37 · 405 阅读 · 0 评论 -
Unity编辑器功能Inspector快捷自动填充数据和可视化调试
我们有时候可能需要在面板增加一些引用,可能添加脚本后要手动拖动,这样如果有大量的脚本拖动也是不小的工作量。原创 2024-03-05 12:22:24 · 598 阅读 · 0 评论 -
Unity将4个纹理图拼接成1个纹理
这里要注意,需要把图的WrapMode改为Clamp,repeat会有接缝。这里随便放一个切分的图。原创 2024-02-26 11:41:19 · 340 阅读 · 0 评论 -
Unity下使用Sqlite
sqlite和access类似是文件形式的数据库,不需要安装任何服务,可以存储数据,使用起来还是挺方便的。首先需要安装DLL。原创 2024-02-13 17:55:13 · 1137 阅读 · 0 评论 -
Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理
我们经常会遇到内存问题,这次就是遇到很多图片的默认格式被改成了RGB32,导致Android打包后运行内存明显增加。原创 2024-01-17 18:48:29 · 619 阅读 · 0 评论 -
Unity URP切换品质和Feature开关的性能问题
现在对我的项目进行安卓端发布,需要切换品质和一些Feature开关。我是这样做的。原创 2024-01-17 18:27:18 · 573 阅读 · 0 评论 -
Unity2022.3打包Android后从AB包加载场景发现丢失大量脚本问题
这两天遇到一个问题,在VR项目打包Android的时候,加载场景后,Timeline工作不正常,找不到原因。原创 2024-01-12 14:35:15 · 626 阅读 · 0 评论 -
Unity场景ab包加载压缩(LZ4,LZMA)格式的测试
LZMA通过UnityWebRequestAssetBundle加载的LZMA格式AB包将自动重新压缩为LZ4压缩,并缓存在本地文件系统上。而通过自己写的下载方案,则可以调用AssetBundle.RecompressAssetBundleAsync API重新压缩。方法来载入,大概需要5.5-7秒时间。LZ4的压缩方式解压速度非常快和无压缩相差不大,压缩后大小比无压缩强的多,这种不需要从公网下载资源的推荐LZ4。最近场景越来越大,大概800M的场景加载时间可能长达40秒左右,所以需要测试看看发生了什么。原创 2023-11-06 17:44:53 · 567 阅读 · 0 评论 -
Unity把UGUI在WorldSpace模式下显示到相机最前方
再VR里有时候要把3D的UI显示到相机最前方,加个UI相机会坏事,可以通过修改unity_GUIZTestMode来解决。Unity把UGUI再World模式下显示到相机最前方。场景包含一个红色的盒子,一个UI里含有这些元素。原创 2023-09-27 11:47:17 · 1114 阅读 · 0 评论 -
Unity用相机实现的镜子效果
代码的原理就是把相机拍摄到的图给Quad的Texture,脚本根据人物的位置来改变位置,并计算近裁面,这里因为有旋转,所以镜子后面最好不要有东西,否则相机会拍摄到,或者用层来避免拍摄到的问题。mirror是镜子,挂着我们的脚本,Quad是一个面片。里面的test1是我用来调试位置的球。画质可以修改maxResolution ,disableDis 是20米距离就不进入Update了,可以节省一些性能,根据自己情况来。玩家就是一个胶囊,里面的eye位置把玩家视角的相机放上去,其他没什么特别的。原创 2023-09-20 18:47:30 · 748 阅读 · 2 评论 -
Unity限制在一个范围内移动
在地图上放了一个小球,让他移动,但是不想让他掉下去,限制在一个球星范围内,就好像绳子拴住了一样,可以这样来实现。这个例子中,我们学习Vector3.ClampMagnitude的用法,限制小球在范围内移动。模拟杆子上有绳子牵制他在一定范围内。我的小球上挂的刚体,物理摩擦力0。原创 2023-08-07 18:13:41 · 1903 阅读 · 0 评论 -
Unity 限制范围-限制在4分之一圆柱形范围内活动
上面的代码就是计算hand在第二象限的限制,首先我们观察到dot 在第二象限是 0 ~ 1 的范围,dot2是 -1 ~ 0 ,当超过这个范围了,我们可以通过GetIntersectWithLineAndPlane函数来计算超过这个结界的碰撞点,防止出界。在我的游戏中,玩家的两只手操控中,不想让他们的手围着自己在一个圆形范围内随便乱跑,左手只想让他在左上角,右手在右上角范围活动。当我们移动到背后的时候,小球最多和我们平行,当小球移动到右边的时候那么最多知道面前,而且不会进入玩家模型范围。原创 2023-07-13 16:15:06 · 518 阅读 · 0 评论 -
AutoHand第三人称的AutoHandVRIK开启和关闭
需要把手部的当前追踪follow改为AutoHandVRIK脚本leftHandFollowTarget和rightHandFollowTarget(也就是原始模型手原来的Transform位置),并且把主VRIK和副VRIK的Weight通过渐变函数改为0,这里改副VRIK的原因是启用IK的时候希望副手的位置也在当前原始点。把手部的follow换回原始的副VRIK的手部位置(这个是AutoHandVRIK在初始化时候处理的,所以我们按照他的思路来)。然后再把VRIK的Weight渐变为1就可以了。原创 2023-07-11 15:20:22 · 304 阅读 · 0 评论 -
Unity 新输入系统InputAction设置按键的阈值
但是这里有个问题,QuestPro的Grip按键很容易被误触,稍微碰一下就触发了,那么如何来设置触发的阈值呢,网上找了很多都没看到有这样的文章,经过研究,下面的方法可以实现。有更好的方法还望不吝赐教。在新的输入系统中,如果添加一个手柄按键只需要添加Pressed就够了,监听他的三个动作就可以得到按下,点击,抬起。可以尝试把Action分解成3个,每个单独去设置PressPoint。类型我都选择了Axis。原创 2023-07-04 10:10:34 · 332 阅读 · 0 评论 -
Unity中通过字符串获得Type.GetType
在Unity中通过System.Type.GetType(“类”) 不能直接使用。这里有个缺陷就是获取到第一个类型相同的就返回了,可以自行处理。我们可以通过下面的方式来获得。原创 2023-06-02 10:50:45 · 711 阅读 · 0 评论 -
VR穿墙处理的三种方式(视线遮挡和胶囊物理挤压和头部物理挤压)
VR穿墙处理的三种方式(视线遮挡和胶囊物理挤压和头部物理挤压)原创 2023-03-07 18:28:31 · 250 阅读 · 0 评论 -
Unity捕获Curl error 28的办法
Unity的UnityWebRequest如果设置了timeout,在超时后会有一个。核心思想就是不用timeout,直接3秒后就判断就是下载到了。的报错,很是讨厌,强迫症患者可以用下面的办法过滤掉。原创 2023-02-23 19:10:12 · 1522 阅读 · 0 评论 -
Unity胶囊物理移动和碰到墙壁无法移动的问题
那么这里需要判断,如果玩家按下了按键,并且不在地面的时候,物理材质给一个系统默认的刚体材质0.6,0.6,如果玩家在地面,那么需要给刚体一个Zero摩擦物理材质,这样可以降低移动中碰到墙体无法移动的问题。如果这时候如果碰到了墙壁,例如面向墙壁45度,这时候就被卡住了,游戏通常会用脸茨(贴)着墙壁移动。这样就可以控制刚体跳跃,飞行等复杂多样的物理运动。对于移动来说可以直接设置刚体的速度。通常我自己制作玩家移动并且是物理的时候,我都喜欢自己去写。可以借鉴FinalIK中的控制代码。这样就可以实现物理移动了。原创 2023-02-07 10:26:32 · 1072 阅读 · 0 评论 -
Unity通过SerializedObject修改SpriteAtlas的属性Include In Build
我们的图集打包的时候是独立打AB包的,所以需要关闭Include in Build,如果自动关闭这个属性呢。最后我们写一个函数,这样在打包时候调用,可以防止多余的资源被打入包体。可以通过SerializedObject来实现。我们发现是m_BindAsDefault属性。原创 2022-11-17 10:22:48 · 783 阅读 · 0 评论 -
Unity里通过FindTexture使用内建Icon图标
我们在Unity中有时会制作自己的编辑器,有时可能想用一些编辑器内部的图标,比单独去找图标资源方便,直接使用系统中内建的图标就很方便。如下图中的图标:例如文件夹图标可以这样获得到每个图片都有一个名字,有哪些名字呢,在官网没找到,但是在Github上有一个图标名字的列表在这里。只有名字也不方便浏览,在这里有一个UnityEditorIcons脚本,直接可以显示这些图标,如果Unity版本迭代更新,可能还会有更新。工具也比较简单,直接把代码贴上来,放在Editor目录中。在Unity编辑器中点击菜单项T原创 2022-09-20 18:09:02 · 1763 阅读 · 0 评论 -
Unity使用Remote直接在手机上调试游戏
Unity上使用Remote直接在手机上调试游戏原创 2022-08-15 18:11:47 · 4949 阅读 · 1 评论 -
Unity自定义属性面板Inspector面板和userData数据保存
Unity自定义属性面板Inspector面板和userData数据保存原创 2022-08-10 11:39:34 · 3171 阅读 · 0 评论 -
Unity使用ConfigurableJoint实现物理拖拽物体
我们把鼠标放开也一起写了,放上全部代码。//UTF8支持 public class CDrag : MonoBehaviour {if(joint!} } }//UTF8支持 public class CDrag : MonoBehaviour {原创 2022-08-02 19:38:24 · 1481 阅读 · 0 评论 -
Unity 使用StateMachineBehaviour让动画控制器状态自动关闭跳出
Unity 使用StateMachineBehaviour让动画控制器状态自动关闭跳出原创 2022-07-05 11:40:13 · 1061 阅读 · 0 评论 -
Unity ECS小知识1 - PhysicsTrigger Event
Unity ECS 小知识1 - PhysicsTrigger Event ,ECS套件学习过程中会遇到各种问题,专门开辟一个专题“ECS小知识”来记录这些点滴。每个小知识文章是没有先后顺序的,这里是第一篇 - 物理触发器 。小知识的所有Demo,都是使用ECS 0.50+的版本。具体不多做阐述,具体如何安装ECS环境,可以看我之前的文章 - Unity DOTS 学习笔记1 - ECS 0.50介绍和安装那么用例开始。如图:...原创 2022-06-24 20:31:25 · 1309 阅读 · 2 评论 -
Unity机器学习3 ML-Agents模仿学习(Imitation Learning)
机器通过自主学习不断强化训练来学习(Reinforcement Learning),随机移动来到目标球位置,相对来说比较简单,只是通过随机数来学习。如果是复杂一点的环境,可能耗费几百万Step也可能无法学习到。本章将介绍让机器人通过模仿进行(Imitation Learning)学习,达到并超越。举例说明什么是模仿学习,假如你家的小狗狗喜欢撕咬沙发,那么你告诉它不要咬他是听不懂的。你可以找一只仿真小狗玩具或者布偶,让布偶去撕咬沙发,然后你再用你沙包大的拳头揍布偶小狗,看看你家狗狗的反应,如果........原创 2022-06-08 19:55:34 · 1279 阅读 · 4 评论 -
Unity机器学习2 ML-Agents第一个例子
Unity机器学习2 ML-Agents第一个例子上一节我们安装了机器学习mlagents的开发环境,本节我们创建第一个例子,了解什么是机器学习。我们的例子很简单,就是让机器人自主移动到目标位置,不能移动到地板范围外。机器学习的过程MLAgents机器强化学习的过程(reinforcement learning)observation - 监视decision - 决策action - 行动reward - 奖罚这4个步骤的翻译可能不是很准确,大概就是先观察,后决策,然后行动,最后奖罚。原创 2022-05-16 18:39:29 · 1885 阅读 · 2 评论 -
Unity机器学习1 ML-Agents环境搭建
第一步,创建一个新的Unity项目我起名为MLApp第二部,首先安装python3.7https://www.python.org/downloads/windows/pyexit()第三步,Unity项目中创建虚拟环境的脚本运行库模块cd UnityProject\MLApppy -m venv venv完成后可以看到多了一个venv目录。通过activeate.bat激活环境脚本,不会影响到其他的python的运行环境。我们运行他。运行后:安装数据流执行计算的开源图,首原创 2022-05-12 10:36:59 · 1576 阅读 · 0 评论 -
Unity DOTS 学习笔记3 - 面向数据设计的基本概念(下)
Unity中的面向数据设计Unity的ECS(Entity-Component-System)是面向数据编程的设计方法,这种模式的主要思想是将数据与逻辑分开。除此之外,它遵循“组合优于继承”的原则,以避免通常通过继承遇到的问题。我将简要描述 Unity 中如何定义实体、组件和系统,然后我计划更深入地了解内存管理。Unity中的内存布局实体(Entity)实体只是一个ID,这使您可以更自由地以您想要的方式对数据进行建模。// Class is provided by Unitypublic str原创 2022-05-05 16:57:39 · 1646 阅读 · 8 评论 -
Unity DOTS 学习笔记1 - ECS 0.50介绍和安装
Unity DOTS 学习笔记1 - ECS 0.50介绍和安装为什么学习这个技术ECS的全称为Entity Component System,是最早由暴雪在GDC2017上提出的一个新的游戏设计框架,数据和处理上都和目前主流的面向对象OOP有很大的差距。他是面向数据编程(DOD),他的优点也就是缺点,不用繁杂的对象和继承关系,只处理符合条件的数据,他的最大优点就是快。看下图说明:来源https://learn.unity.com/tutorial/part-1-understand-data-ori原创 2022-03-30 12:14:20 · 6038 阅读 · 0 评论 -
根据Mesh模型的UV坐标获得这一点的法线和点坐标
根据Mesh模型的UV坐标获得这一点的法线和点坐标这段代码经常用到,忘了从哪里复制过来的,经过了一些修改。using System.Collections;using System.Collections.Generic;using UnityEngine;public class GameFun { /// <summary> /// //UV坐标转换成3D坐标 /// </summary> /// <param name="m原创 2022-03-01 18:22:29 · 968 阅读 · 0 评论 -
通过Unity的铰链(HingeJoint)来制作弹簧门
弹框门就是很多办公区域或者大门,推开后进入后弹簧会自动关闭门。Unity里通过HingeJoint物理可以实现,如果你需要这样的逼真感觉。首先在场景中放置一个门框(紫色),作为合页和弹簧的安装处。:)当然我偷工减料只给一个柱子就够了。再放一扇木门(土灰色) 如图:首先给门框和门都增加Rigidbody(刚体),这个是必要的。门框的刚体因为门框是不进行碰撞运动的,所以必须勾上IsKinematic(运动学刚体)门因为要旋转运动,而且有东西穿过要碰撞互动,所以不用运动学刚体。...原创 2022-02-21 10:17:15 · 8095 阅读 · 2 评论 -
Unity 编辑器下对Prefab预设的一些操作
//给预设增加AssetBundle名称 [MenuItem("ILFrameWork/Prefab rename", false, 10)] static void reboot_rename() { setPrefabname("xxx"); } //给一个对象命名预设名称,可以选择多个,并单独命名 static void setPrefabname(string xxx) { foreach (var obj in ...原创 2022-02-11 14:58:40 · 2800 阅读 · 0 评论 -
性能分析和优化实战
游戏中的MainCamera是游戏主相机,我们能看到图中的娃娃3D模型,而3D模型上的图案是通过上面的2DPaintRoot里的JvgCamera(下面简称2D相机)呈现到3D上的材质球的纹理映射上去的。我们再来看下图中的GPU,还是CameraRender,我们看到了MainCamera已经到3.7,大于2D相机的2.0了,之前是2000x2000的RenderTexture会比MainCamera高一点,所以我降低了,更加能认识到纹理大小对性能的影响。通常来讲是没错的,但是对于这个项目来说并不适用。原创 2021-12-21 17:56:03 · 105 阅读 · 0 评论 -
四元数学习:Quaternion.AngleAxis
我们首先来个题目,假设有一个点(point1),我们想让这个点按照某个点(center)旋转轴是世界z轴来旋转一个度数如何做呢,这样如果把度数改成0-360渐变,那么就和一个表盘的秒针一样旋转了。如何实现呢 ?首先看下这个系统函数public static Quaternion AngleAxis (float angle , Vector3 axis );获得四元数,参数1是角度,axis是旋转轴。那么角度先给90度我们来测试下,axis当然是按照Z轴正方向来旋转 。 //首先计算按照四元数原创 2021-11-05 19:40:03 · 3273 阅读 · 0 评论 -
在Unity中制作配置文件通过ScriptableObject来保存数据
有时需要在Unity写一个配置保存数据,可以使用ScriptableObject类来实现。例如:using System;using UnityEngine;[CreateAssetMenu]public class IDXData : ScriptableObject{ public int idx; public int ver;}通过鼠标右键创建后就可以填写数值了。如果要读取可以通过LoadAssetAtPath这样来使用我们创建一个编辑器脚本,加一个菜单调原创 2021-10-14 15:15:27 · 1708 阅读 · 0 评论