unity

unity和lua开发游戏常备技能

…衆ロ難τιáo~ 提交于 2019-12-04 00:01:33
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 一。使用制作滑动列表:使用UILayout做虚拟列表 ui.list = base:findcom("center/ScrollView/Viewport/Content", "UILayout") ui.list.onCreate = base.createrender ui.list.onUpdate = base.updaterender ui.list.ItemRenderer = Asset:LoadAsset(asseturi.getassetpath(base.module, "manualItem")) --创建item function base.createrender(go) local render = {} render.lv = utils.findtext(go, "lv")--等级名字 taskitems[go] = render end 刷新item function base.updaterender(go, index) local render = taskitems[go] local currLv=lv if lv>index then --已达到等级 render.lv="已达成" else render.lv="未达成" end end 需要注意的是

Unity3D研究院之加密Assetbundle不占内存(一百零五)

。_饼干妹妹 提交于 2019-12-03 23:23:57
https://www.xuanyusong.com/archives/4607 AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。 Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundle.LoadFromMemory那样多占一份很大的内存了。 打包Assetbundle的同时生成加密文件的两个文件分别加载它。 myab.unity3d encypt_myab.unity3d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ MenuItem ( "Tools/BuildAB" ) ] static void BuildAB ( ) { FileUtil . DeleteFileOrDirectory ( Application . streamingAssetsPath ) ; Directory . CreateDirectory ( Application . streamingAssetsPath ) ; var manifest = BuildPipeline . BuildAssetBundles ( Application .

Unity AssetBundle 加密

与世无争的帅哥 提交于 2019-12-03 23:22:01
https://blog.csdn.net/wangjiangrong/article/details/89671861 前言 昨天面试,面试官问了些有关AB包相关的知识点,问到了有关AB加密的问题,由于之前没有了解过,而且感觉是一个蛮重要的一个环节。所以今天查了查相关知识,记录一下(要是不对的地方,欢迎大佬们帮忙纠正) 我们都知道我们的ab包都是放在包体的可读文件夹下,玩家是可以很轻易的取出我们的ab包,若没有做加密处理的话,按照正常的读取ab包的操作,任何人都可以加载出我们ab包的内容,然后并使用,这显然是很不安全的。 这里我们用一个简单的加密算法,对我们的ab包进行加密。 思路 在得到ab包后,我们遍历StreamingAssets目录,获取所有的ab包,然后逐个将ab包转为byte[],然后byte[]中的每一位都和设定好的秘钥key执行异或操作(加密)。最后将新的byte[]重新写入文件中,即加密完成。 在ab读取的时候,也要从原本的AssetBundle.LoadFromFile()方法转为用AssetBundle.LoadFromMemory()方法,传入的byte[]参数同样是将要读取的ab包转为byte[],然后每一位和秘钥key执行异或操作(解密)。 注:A 异或 Key = B,B 异或 Key = A。 代码实现 本代码是跟着之前打包ab包的工程内加的

Unity EventSystem(不是原创)

依然范特西╮ 提交于 2019-12-03 22:48:11
Unity EventSystem Message System Input Modules Supported Events Raycasters 1. Message System(改进的消息系统) 基本上可以看成是以前SendMessage的升级版。 使用方法(照抄官网): step1. 声明一个接口,继承自IEventSystemHandler public interface ICustomMessageTarget : IEventSystemHandler { // functions that can be called via the messaging system void Message1(); void Message2(); } step2. 实现这个接口 , 把这个脚本挂在某个物体上,这里假设为物体AAA public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget { public void Message1() { Debug.Log ("Message 1 received"); } public void Message2() { Debug.Log ("Message 2 received"); } } step3. 在任何脚本中使用 ExecuteEvents

在Unity 5中优化SkinnedMeshRenderer

橙三吉。 提交于 2019-12-03 20:12:24
过早优化是万恶之源”——Donald Knuth 不少开发者在前期开发过程中对算法等类似的开销都甚少关心,而是更倾向于尽可能简单的解决某个问题,后面必要时再进行优化。这能极大加速开发进度,并保证代码简洁。但开发后期通常会出现的瓶颈就是图形资源,而优化图形渲染这一块比较有难度。 本文将分享作者Lamebait在使用Unity5制作沙盘游戏过程中优化SkinnedMeshRenderers的相关步骤提供给大家参考。 第一次迭代——使用不带动画的网格 每个城市街区约有15个网格,首先最显著的问题就是不断被加载到游戏中Mesh数量。当街区数量增长到数百之后,DrawCall数量也飙升到大多硬件所不能承受之高。Unity支持网格批处理,能减少一部分DrawCall。但所有网格都是有动画的,所以这些网格用的是SkinnedMeshRenderer组件而非MeshRenderer,Unity不支持对SkinnedMeshRenderer进行批处理。 第二次迭代——SkinnedMeshRenderer.BakeMesh() 所有的建筑和树木都只在它们出现和消失的时候有渐入和渐出的动画,一旦稳定下来之后就是完全静止的了,那可否在此期间将它们变为MeshRenderer呢? 如果使用带有MeshRenderer的无动画网格

unity工具开发

谁说我不能喝 提交于 2019-12-03 17:29:52
1.EditorWindow通过拖拽获取文件夹或者文件路径 #region 拖拽相关 Rect rect4 = EditorGUILayout.GetControlRect(); //将上面的框作为文本输入框 selectPath = EditorGUI.TextField(rect4, selectPath); //subPath = EditorGUILayout.TextField(subPath); //如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在的位置在文本输入框内 if ((Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited) && rect4.Contains(Event.current.mousePosition)) { DragAndDrop.visualMode = DragAndDropVisualMode.Generic; if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0) { selectPath = DragAndDrop.paths[0]; } } #endregion 2.反序列化 public static Object

Unity 自定义Inspector面板 样式

 ̄綄美尐妖づ 提交于 2019-12-03 16:16:04
有时候为了开发更加方便,会重写Inspector面板或者Editor窗口。一般情况下,Unity已经将public修饰符的字段自动序列化,使得该字段能够在Inspector面板中能够被修改。而且也添加了许多unity的特性,例如[Range(0, 100)],[HideInInspector]等等,需要了解的同学们可以百度一下。 这次我们说的是Inspector面板。 马上看看效果及代码。 using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(NewBehaviourScript))] public class InspectorTest : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); GUILayout.Label("Expansion", "GUIEditor.BreadcrumbLeft"); GUILayout.Label("Expansion", "WhiteBoldLabel"); GUI.color = Color.green; GUILayout.Label("Expansion", "NotificationText"); GUILayout

unity Inspector 绘制

僤鯓⒐⒋嵵緔 提交于 2019-12-03 16:15:50
在游戏开发中我们很可能需要一些工具,当自己开发工具的时候就需要在inspector页面进行绘制一些内容,我最近在写一些工具上的内容,这里就编写一些我学习这边的一些内容: 1、首先编写的inspector的方法都需要写到Editor文件夹下,这个文件夹没有什么要求,就是名字要写对,unity会在进入界面的时候自行进行编译内容; [ExecuteInEditMode] //在编辑模式下运行,不需要运行游戏就会运行 [CustomEditor(typeof(Test))] //制定是那个脚本需要自定义inspector 该类必须继承Editor ;此处需要引用using UnityEditor 2、在现实该组件脚本的时候u3d会回调OnInspectorGUI()方法,如果此处不回调基类的方法就会不会显示系统 默认的UI界面,所以此处可以自己进行处理 public override void OnInspectorGUI() { base.OnInspectorGUI(); } 用户在选择这个脚本,当将其拖动到指定的对象上时就会回调OnEnable()方法 void OnEnable() { } 通过新建立一个 SerializedObject 对象,这里target对象是editor提供的一个对象,就是要给那个脚本赋予 的inspector的对象

Unity Shader 入门 之一 语法基础

流过昼夜 提交于 2019-12-03 16:15:38
unity shaderlab 的语法基础 ,用来做个人备忘查询 ShaderLab Syntax Unity中的所有Shader都是用一种叫做"Shader Lab"的陈述性语言(declarative language)写的。在Shader中通过逐层嵌套的大括号来声明包括在材质面板看到的一系列变量、使用的渲染模式、硬件不支持时的fallback等。而真正的"shader代码"夹在CGPROGRAM...ENDCG之间的代码片段。本节就合租要介绍这些嵌套的语法。而真正CGPROGRAM代码段是通过常规的HLSL/Cg 着色器语言完成的。 ShaderLab Shader "shadername" { [Properties] Subshaders [Fallback] [CustomEditor] } shadername: "shadername "是你通过inspector面板为材质选择shader时看到的名字,可以用"/"生成类似二级三级菜单的形式,例如" custom/example" Properties: shader中用到的一些额外参数,可以在材质的inspcector面板中看到,例如颜色,贴图等 Subshaders: 每一个Shder都是由一个或者多个sub-shader组成的。当加载一个shader的时候,unity 会从头遍历这一系列的subshader

unity Shader 扭曲效果

╄→尐↘猪︶ㄣ 提交于 2019-12-03 16:15:21
原理 所谓扭曲就是扰动一个物体的uv坐标,表现出来就是一个扰动效果,如火焰扭曲空气,和水波对水底的影响。 1. 在shader 中我们需要一张当前渲染的纹理 2. 给一个物体渲染并使用当前纹理,用屏幕坐标作为uv坐标加上一个扰动值 unity 1. unity提供了抓取的pass: GrabPass unity官网介绍 //每次遇到这个pass就去抓取一次提供了了一个默认名称_GrabTexture 不推荐使用 GrabPass { } //第一次遇到去抓取一次每帧只会抓取一次,名称由你自己定义 GrabPass { "_BackgroundTexture" } 2. 获取物体的屏幕坐标,unity也给出了内置函数 //官网代码 v2f vert(appdata_base v) { v2f o; // use UnityObjectToClipPos from UnityCG.cginc to calculate // the clip-space of the vertex o.pos = UnityObjectToClipPos(v.vertex); // use ComputeGrabScreenPos function from UnityCG.cginc // to get the correct texture coordinate o.grabPos =