unity

Unity3D开发之代码创建圆柱体

陌路散爱 提交于 2019-12-03 15:43:23
看到这篇文章你可能好奇unity自带圆柱体组件,直接就可以生成,为什么我们还要用代码生成。其实是最近领导对项目有一个要求,就是我们要在自写编辑器内操作圆管,也就是圆柱体。功能类似3DMax里的拉伸管线。刚开始看到这个要求我内心是拒绝的,mmp我是unity程序员不是图像学程序员啊,这看着有点底层啊。但是心想,这也是自我学习提升的机会,于是我就给领导个面子将它实现吧。我们知道如果想像3Dmax里那样操作管线,就必须用代码创建圆柱体并用代码控制他的顶点位置才能实现我们的需求。所以第一步就是用代码创建我们需要的圆柱体。实现的效果如下: 其实之前我自己尝试了解创建立方体的代码,看着很简单,其实也不简单,主要是对顶点,以及对应组成三角面顶点顺序的设置。我在网上搜到一篇自写圆柱体的代码,看着不错,直接复制来了,但是他提供的少两个面。所以需要我们自己去补上这个面。然后很重要的一点是 两个面的交点不可以共用,必须再添加一次,因为涉及到法线的问题 。 //圆柱体是由两个圆和一个长方形组成的 先输入长方形的顶点 然后在输入圆顶点 private void UpdateMesh(Mesh mesh,int edg_x, int edg_y, float rad, float len) { edg_x = Mathf.Max(2, edg_x);//保证最低2个边 edg_y = Mathf.Max(2,

Unity Editor 编辑器扩展 十 Handle控件

浪子不回头ぞ 提交于 2019-12-03 15:39:54
目录 Handle控件 按钮控制柄窗口 Handle控件 按钮,控制柄,窗口 效果见图: 创建HandleTest.cs脚本,挂载到一个控物体上,然后在Editor文件夹下创建如下脚本: using UnityEngine ; using UnityEditor ; [CustomEditor (typeof(HandleTest))] public class HandleInspector : Editor { int windowID = 1234 ; Rect windowRect ; void OnSceneGUI () { // 1. 物体控制柄 var component = target as HandleTest ; PositionHandle2 (component) ; PositionHandle (component .transform ) ; // 2. 控制按钮 HandleButton () ; // 3. 控制窗口 GUIWindow () ; } void PositionHandle2 (HandleTest component) { var transform = component .transform ; if (Tools .current == Tool .Move ) { transform .rotation =

Unity Editor 编辑器扩展 七 创建脚本模版

我与影子孤独终老i 提交于 2019-12-03 15:39:44
这篇文章介绍一下用编辑器窗口自定义创建脚本模版。 目录 了解模版脚本 深入了解模版创建 了解模版脚本 我们在Unity中创建脚本时会自动创建如下的脚本 在Unity的安装文件中存储了它的模版,我们可以按下列路径查看: Mac /Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates Windows C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates 这里看下Mac下的路径 这就是程序天天要用的模版,我们可以手动修改他,例如删掉那个万年不变的备注,或者添加一个Awake()函数。 深入了解模版创建 以C#脚本模版为例: 81–表示在菜单中的显示顺序; C#Script – 表示在菜单中的显示名称; NewBehaviourScript – 默认文件名; .cs – 文件的格式。 根据上面的信息,我们也可以自己创建新的脚本模版,首先在工程中创建ScriptTemplates文件夹,再创txt文件如下 100-C#MyDefineScript-MyDefineScripts.cs.txt using UnityEngine; using System.Collections; public class #SCRIPTNAME# :

Unity3D自定义资源配置文件

。_饼干妹妹 提交于 2019-12-03 15:39:05
配置资源文件估计大家了解很多,比如XML、JSON、Protobuf、Excel、TXT等等 在开发过程中,将游戏数据序列化到配置文件中,项目运行时读取配置文件中的数据 本文另外介绍一个Unity的配置文件(.asset) 该配置文件的优点: 当我们需要将游戏资源里的贴图(Texture)、游戏对象(Gameobject)等预设体保存到配置文件时,这时我们就可以使用该配置文件 但是当关联的预设体丢失时,需要重新将预设体关联起来 接下来,我写了一个Demo,介绍在Unity3D创建自定义配置资源文件 点击打开链接 【管理类】 创建一个管理类,提供函数来创建和读取配置文件(.asset) 在这里我已经简单的封装好了,大家下载来后直接使用即可 using UnityEngine; using System.Collections; using System.IO; using UnityEditor; public class CustomConfigManager<T> where T : ScriptableObject//对泛型参数进行约束,使其只能是ScriptableObject的派生类 { private static CustomConfigManager<T> _instance; public static CustomConfigManager<T>

Unity 简记(1)--TileMap

微笑、不失礼 提交于 2019-12-03 15:38:16
## Tilemap是unity中自带的快速构建2D场景的工具,优点是省时省力, 1 使用方法 在场景创建一个Tilemap 打开TilePalette ​ 3.创建一个新的Palette,将地图切割好拉进去,点一下要画的格子,再点一下笔,就可以开始画了 2. 要点 1.若画的图片小于方格 则可在Grid的cell size处更改方格大小 若还存在缝隙问题可见下面分享博文 2.绑定碰撞体,给Grid的Tilemap添加Tilemap collider2D和rigidbody 2D组件,然后为了让地面不受重力掉下去或者被它上表面的物体压下去,将rigidbody 2D设为静态(static)刚体 3.直接Tilemap collider2D组件是每个方格加上碰撞体,其实可进行优化,再为其添加Composite Collider2D组件,再去Tilemap Collider2D那勾选上Used By Composite就可以自动优化成复合体碰撞体 ​ 分享博文: Unity中使用Tilemap快速创建2D游戏世界: https://www.jianshu.com/p/d8fe795bf6c7 彻底解决 Unity 中 Tilemap 缝隙问题: http://liaoyulei.cn/2017/05/08/fix-unity-tilemap-gap/ Unity 生成随机房间、洞穴

Unity 简记(2)--2D移动

喜夏-厌秋 提交于 2019-12-03 15:38:00
目录 1.输入 1.1直接检测按下哪个按键 1.2.检测水平输入和垂直输入 2.移动 2.1.Transform组件 2.2.RigidBody组件 2.3.NavMeshAgent组件 2.4.CharacterController组件 2.5.Vector 3 3.手感优化 4.符合自己的游戏 1.输入 Unity输入方式有三种: 1.1直接检测按下哪个按键 ​ 直接检测有两种: A. 直接检测按键,优点:简单方便,效率高 缺点:修改按键麻烦 if(Input.GetKeyDown(KeyCode.X)) //X代表键盘上的某个按键 。。。 B. 间接检测按键,优点:方便修改按键 public KeyCode JumpButton = KeyCode.Space; //提前设置好不同功能对应按键 if(Input.GetKeyDown(JumpButton)) 。。。 1.2.检测水平输入和垂直输入 ​ 分为两种: A.键盘类(适合横版过关) ​ 1.Vertical 对应键盘上面的上下箭头或W,S键,当按时触发 ​ 2.Horizontal 对应键盘上面的左右箭头或A,D键,当按时触发 B.鼠标类(适合飞机弹幕) ​ 1.Mouse X 鼠标沿着屏幕X移动时触发 ​ 2.Mouse Y 鼠标沿着屏幕Y移动时触发 ​ 3.Mouse ScrollWheel

Unity Editor编程杂记

会有一股神秘感。 提交于 2019-12-03 15:37:50
1.EditorGUIUtility.labelWidth static public void SetLabelWidth (float width) { EditorGUIUtility.labelWidth = width; } 通过设置EditorGUIUtility.labelWidth来设置EditorGUI控件的label的宽度(以像素为单位)。 何谓“EditorGUI控件的label”? 举个例子,下图的clipping那一行是EditorGUI的popup类型的控件,它由两部分组成:左边的label和右边的弹出框。label的宽度就是Clipping的宽度,从C开始直到弹出框的距离(包含中间的空隙) 控件的label有默认的宽度,把EditorGUIUtility.labelWidth设为0就恢复为默认的宽度。默认的宽度可能会变化,比如根据整个窗口的宽度变化而变化。 2.EditorGUIUtility.fieldWidth 大多数的EditorGUI控件都包含一个label和一个field。label的宽度可以由EditorGUIUtility.labelWidth来控制。field的 最小宽度 则由EditorGUIUtility.fieldWidth来控制。 为何说最小宽度? 因为一般来说,每一个控件有一个总的宽度

Unity編輯器案列

左心房为你撑大大i 提交于 2019-12-03 15:37:35
【Unity】编辑器小教程 目录 (?) [+] 写在前面 场景一 场景二 场景三 场景四 场景五 场景六 场景七 场景八 场景九 写在前面 Unity最强大的地方之一是它扩展性非常强的编辑器。Unite Europe 2016上有一个视频专门讲编辑器编程的: https://www.youtube.com/watch?v=9bHzTDIJX_Q 这里大概记录一下里面的关键点。 场景一 关注点 : 绘制重要区域,Gizmos.DrawXXX OnDrawGizmos和OnDrawGizmosSelected回调函数 点击Gizmos按钮就可以在Game视图也看到线框了 // OnDrawGizmos()会在编辑器的Scene视图刷新的时候被调用 // 我们可以在这里绘制一些用于Debug的数据 void OnDrawGizmos() { Gizmos.color = new Color( 1f, 0f, 0f, 1f ); Gizmos.DrawWireCube( transform.position + BoxCollider.center, BoxCollider.size ); Gizmos.color = new Color( 1f, 0f, 0f, 0.3f ); Gizmos.DrawCube( transform.position + BoxCollider

Unity人物残影实现

房东的猫 提交于 2019-12-03 15:36:42
一.最近学习unity看到一个关于人物残影的实现过程,在这里记一下,大概原理就是 通过获取人物的SkinnedMeshRenderer组件,然后将其中重要的材质和Mesh赋值给新创建的Gameobject物体上,然后设置淡出效果,按生存周期销毁gameobject就好了; 详细的看代码吧; 为人物添加脚本:(脚本中设有注释就不多说了) <span style="font-size:18px;">using UnityEngine; using System.Collections; using System.Collections.Generic; public class DestroyShadow : MonoBehaviour { public float interval = 0.1f; //残影的时间间隔; public float lifeCycle = 2f; //残影的生存周期 float lastCombineTime = 0.0f; //上次组合时间; MeshFilter[] meshFilters = null; SkinnedMeshRenderer[] skinnedMeshRenderers = null; List<GameObject> objs = new List<GameObject>(); // Use this for

Unity UI案例(绘制圆环)

倾然丶 夕夏残阳落幕 提交于 2019-12-03 15:36:08
详细设计: 1.饼图的绘制过程: 1.1 获取以某个点为中心,固定半径的圆上的点,再结合原点绘制三角面,可生成扇形; //计算圆上点的位置 Smooth代表圆的光滑程度,也就是饼图被分为多少等份 int Smooth = 100; float perRadian = Matfh.PI * 2 / Smooth;//得到每份所占弧度 然后根据某一块饼图所占的比例计算出它在圆周上相交的点,我们规定从饼图右侧中间位置开始,逆时针方向计算。见图1: //比如绘制19%比例的扇形图 float radius = x;//半径 float startRadian = 0; Vector2 startPoint = new Vector2( radius,0 ); for( int i = 0 ; i * perRadian < 0.19f * Mathf.PI * 2 ; i ++ ) { float endRadian = startRadian + perRadian; Vector2 endPoint = new Vector2(Matfh.Cos(startRadian),Mathf.Sin(endRadian)); startRadian = endRadian; startPoint = endPoint; /