unity

Unity Editor 基础篇(十四):Scene面板菜单

≯℡__Kan透↙ 提交于 2019-12-03 14:21:12
Unity Editor 基础篇(十四):Scene面板菜单 效果: 代码:(脚本放在Editor目录) public class SceneEditor { [InitializeOnLoadMethod] //unity初始化时调用 static void Init() { SceneView.onSceneGUIDelegate += OnSceneGUI; } static void OnSceneGUI(SceneView sceneView) { //... } } 这样Scene面板刷新时候会执行这里的OnSceneGUI方法。 例如 我们想点击Scene面板时候打开一个菜单,这在OnSceneGUI函数里写: ddCommonItems(); Show(); 调用这两个函数; 定义在下面: static public void AddCommonItems() { AddItem("新建", false, UIEditorHelper.CreatNewLayoutForMenu); //第三个参数是点击按钮要调用的函数 AddItem("打开界面", false, UIEditorHelper.LoadLayout); AddItem("打开文件夹", false, UIEditorHelper.LoadLayoutWithFolder); } static

Unity3D 在自定义脚本中实现Button组件上的OnClick面板

微笑、不失礼 提交于 2019-12-03 14:19:42
Unity3D 在自定义脚本中实现Button组件上的OnClick面板 UnityEvent 脚本代码 事件传参 多参数传入 下述内容不对c#语法做过多讲解,仅对已入门并有兴趣的同学做为学习和拓展的资料 大家在Unity制作的过程中一定都使用过UI功能,那么很多人也一定见过这个面板: 那么我们如何能在自己的脚本中添加上像OnClick这样的面板呢。 UnityEvent Unity中内置了一个 UnityEvent 类作为事件处理的类,我们只要在脚本中声明出来,Unity便会自动添加到脚本面板上,这样便可以在脚本之外添加移除事件,非常方便。 脚本代码 using System . Collections ; using System . Collections . Generic ; using UnityEngine ; using UnityEngine . Events ; //需要引用命名空间 public class SelfScript : MonoBehaviour { public UnityEvent OnStartEvent ; //声明公有变量 // Use this for initialization void Start ( ) { OnStartEvent . Invoke ( ) ; //执行添加的事件 } /// <summary> ///

Unity 自定义字体 新功能 一

百般思念 提交于 2019-12-03 14:15:06
Unity 自定义字体 新功能 一 首先找一个字体库,我用的 Windws 系统,直接找微软的字拿来用, 在 目录下 C:\Windows\Fonts 随便找一个字体 在此我就拿 华为琥珀 字体(字体类型为 .TTF) 直接双击 华为琥珀字体,会自动弹出字体样板如下: 字体样子就是上图那样的。 将字体库 拖拽到 Unity 中,将字体库改名为 HWHP, 创建一个 Text,将 字体库拖拽到 Text上,输入字符如下 有时候我们只需要一个字体库中的某几个字符,比如 0 - 9 的数字,如果将整个字体库都放进来,会造成很大的空间占用,下面我把需要用到的字符取处理,其他的扔掉,这样就省很多空间了 选择字体库 Font Size : 字体表现效果最好时的字体大小,在此设置为 30 Rendering Mode :渲染类型,选择 Smooth Character :字符类型,自定义需要的字符必须选CustomSet Custom Chars :选择 CustomSet 后自动出现 Custom Chars输入框 将需要的字符输入进 Custom Chars 输入框后,点击右下角的 Apply 那么现在到工程目录中找到 HWHP, 看该字体库现在占用空间大小 3.54M ,大小和没制作前占用空间是一样大的,这样的话,我使用的字符少了,空间还是这么大,这样我就无法接受了

Unity 自定义事件

一个人想着一个人 提交于 2019-12-03 14:14:48
Unity 自定义事件 EventId.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Assets.Scripts.Event { //事件ID public enum EventId { event1, event2, Count,//必须写在最后 用于表示所有Event的个数以及存储时间数组长度 } } EventEatResponse.cs using UnityEngine; using System.Collections; namespace Assets.Scripts.Event { public enum EventEatResponse { /// 继续向下一个已经注册该事件的游戏体传递当前事件 NotEaten, /// 停止向下一个已经注册该事件的游戏体传递当前事件 Eaten, } } EventObservers.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using Assets.Scripts.DataStructures; using Assets.Scripts

Unity自定义UI组件(三)饼图篇

我的梦境 提交于 2019-12-03 14:14:29
Unity自定义UI组件(三)饼图篇 博主在工作中曾经多次遇到过要计算并显示一些数据占比的功能,但是数值的显示不够直观,然后在Unity商店中看到有人编写过类似的UI插件,但是价格小贵,就萌发了自己编写类似插件的冲动,第一次编写是利用Image组件设置为Filled类型时可实现扇形的功能进行组合,弊端特别明显就是需要制作预制物,使得代码量比较庞大,而且为了实现一些炫酷的功能,还得引入缓冲池去避免不停生成扇形带来的性能妥协,之后在了解了MaskableGraphic类型之后,利用底层绘制,可以避免由组件拼合的多种性能的妥协,而且极易移植,因为只需要的一个脚本即可,下面会详细讲解如何绘制,并将附上源码。 主要内容: 1.饼图的基础实现 2.饼图百分比文字的显示 3.饼图文字的自适应 4.饼图样式自定义 实现效果: 详细设计: 1.饼图的绘制过程: 1.1 获取以某个点为中心,固定半径的圆上的点,再结合原点绘制三角面,可生成扇形; //计算圆上点的位置 Smooth代表圆的光滑程度,也就是饼图被分为多少等份 int Smooth = 100; float perRadian = Matfh.PI * 2 / Smooth;//得到每份所占弧度 然后根据某一块饼图所占的比例计算出它在圆周上相交的点,我们规定从饼图右侧中间位置开始,逆时针方向计算。见图1: //比如绘制19%比例的扇形图

Unity自定义UI组件(一)函数图篇(上)

夙愿已清 提交于 2019-12-03 14:14:12
Untiy自定义UI组件 ==转载标明出处== MaskableGraphic(可遮罩图形): MaskableGraphic是Unity中多种UI组件的父类,比如Image、Text等。Untiy官网中关于 MaskableGraphic 的介绍只有一句: A Graphic that is capable of being masked out. 一个可以遮盖的图形 1.关键属性maskable,当它等于false代表不可遮掩,等于true代表可以被其他组件遮盖。 2.关键方法 OnPopulateMesh ,在继承了MaskableGraphic的子类中重写该方法,向OnPopulateMesh方法中传入对应的VertexHelper类型(5.0以前的版本4.X是传入Mesh类型)的数据,即可构建出自己想要的组件。 3.VertexHelper是一个包含了网格数据中的顶点数据和三角面对应顶点的序号,不了解网格数据的同鞋可以去查看一下Mesh类型后者查看我的其他网格类型博文。 一个简单例子:在XY坐标轴绘制函数图 实现逻辑: 1.定义XY轴和箭头常量 1.1先定义一下XY轴的一些常量,写在一个单独的类中并序列化,这样可以在Inspector面板上显示常量并方便调节常量。 //序列化该类型 [Serializable] public class

unity自定义特性7.2

冷暖自知 提交于 2019-12-03 14:13:50
前言 在导入别人插件的时候,常常会发现上面菜单栏中会多出几个菜单,在后来的学习中发现,原来unity还可以自定义特性 unity中的特性类分别定义在两个命名空间中。 unityEngine 和 unityEditor. AddComponentMenu 特性在 UnityEngine中, Unity3D中常用的一些特性定义在UnityEngine中; 1:AddComponentMent ,添加 组件菜单 [AddComponentMenu("Transform/DeBugPlatform")] 这个要加在 一个Mono脚本前声明 [AddComponentMenu("Transform/DeBugPlatform")] public class AttrDebugPlatfom:MonoBehaviour { void Start() { Debug.Log( Application.platform.ToString()); } } 这个作用就是运行时Debug平台。 可以把鼠标放到上面,VS F12 追踪到源可以发现AddComponentMenu 类是从 System.Attribute类中派生而来的 符合 CLS(Common Language Specification) 关于定制的要求,至少需要一个公共构造器。 例如以下 namespace UnityEngine{

Unity 自定义脚本模板

独自空忆成欢 提交于 2019-12-03 14:13:38
找到模板 C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates 修改模板 将自己想要自定义模板的原版复制一个副本,并自定义名称 80:序号;Tmz Script:一级列表中的名称;NewTmzScript:新建出来脚本的名称 修改自己想要的模板内容 保存模板 保存模板,并 重启Unity 试用模板 自定义模板添加成功 来源: CSDN 作者: asitini 链接: https://blog.csdn.net/weixin_43112045/article/details/90372332

Unity自定义ScriptableObject属性显示的三种方式

 ̄綄美尐妖づ 提交于 2019-12-03 14:13:24
1. 继承Editor,重写OnInspectorGUI方法 Editor官方文档 效果 实现 定义一个测试类TestClass,一个可序列化类DataClass [CreateAssetMenu] public class TestClass : ScriptableObject { [Range( 0 , 10 )] public int intData; public string stringData; public List<DataClass> dataList; } [System.Serializable] public class DataClass { [Range( 0 , 100 )] public int id; public Vector3 position; public List< int > list; } //指定类型 [CustomEditor( typeof (TestClass))] public class TestClassEditor : Editor { SerializedProperty intField; SerializedProperty stringField; void OnEnable() { //获取指定字段 intField = serializedObject.FindProperty( "intData" )

Unity自定义Inspector属性面板

末鹿安然 提交于 2019-12-03 14:13:05
有时候,为了改善Unity的工作流程,我们会在Unity Editor下对界面进行二次开发或者做一些方便使用的扩展工具。今天讲的内容就是自定义Inspector属性面板。 在这里,我会通过最小单元的代码来实现自定义的Inspector。更高级的扩展需自行查阅。 实现自定义Inspector的流程 1、 继承命名空间UnityEditor下的Editor基类。 2、 添加[CustomEditor(typeof(XXX))]注解,告诉编辑器这个类是扩展哪个组件的Inspector。 3、 重写OnInspectorGUI方法,自定义重绘内容。 初始Inspector显示 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class LevelScript : MonoBehaviour { public int experience; public int Level { get { return experience / 750; } } } 效果: 自定义Inspector显示 在Assets下创建Editor文件夹,添加脚本 代码: using System.Collections; using System.Collections.Generic;