unity编辑器和插件(三)
来源:互联网 发布:天才麻将少女 知乎 编辑:程序博客网 时间:2024/06/02 11:04
接下来 我就开始正规的编辑器和插件的制作。
我这里是按照 IOS android的 控件为例子模板。来制作 一套使用 unity书写的控件。
好首先我们来想下 IOS 和android的 控件都是以四边形基础的。
SO,
接下来 我们来转像unity,在unity中 我们怎么去建立一个四边形那, 依照图形绘制的原理。三点一面的理论。我们可以使用6个点来建立一个两三角形组成的四边形。
我们先学会怎么去绘制一个view,也就是简单的一个色面。
我们知道 unity中得面也是采取这种的绘制方法,绘制一个面就会多一个drawcall,为了面绘制的节省,我们就会使用面合并的原理,来减少drawcall的产生(opengl自动处理)。
好,我们来定义六个点:
public static int[] initTri(){int[] triangle = new int[6];triangle [0] = 0;triangle [1] = 2;triangle [2] = 1;triangle [3] = 2;triangle [4] = 3;triangle [5] = 1;return triangle;}有了 6个点,我们就要去定义三角形的大小。
public static Vector3 [] initVertice(float width ,float height,float ancPointx,float ancPointY){ Vector3 [] viewVer = new Vector3[4]; viewVer [0] = new Vector3 (-ancPointx*-width,-ancPointY*height,0); viewVer [1] = new Vector3 ((1-ancPointx)*-width,-ancPointY*height,0); viewVer [2] = new Vector3 (-ancPointx*-width,(1-ancPointY)*height,0); viewVer [3] = new Vector3 ((1-ancPointx)*-width,(1-ancPointY)*height,0); return viewVer; }其中ancPointx,ancPointy,为 我们经常用到的锚点,width,height就是你要绘制的面的宽和高了。
好了 有了这些东西 现在制作一个没有任何颜色的几条线组成的线框。
我们为了让这个面有颜色,必学要有 法线 和 材质,shader 这样才是一个完整的 色面。
法线
public static Vector3[] initNormal(){ Vector3[] normals = new Vector3[4]; normals[0] = -Vector3.forward; normals[1] = -Vector3.forward; normals[2] = -Vector3.forward; normals[3] = -Vector3.forward; return normals; }
当然如果还想去绘制图片在面上就要有 UV的的定义
public static Vector2 [] initUV(){ Vector2 [] uv = new Vector2[4]; uv[0] = new Vector2(0, 0); uv[1] = new Vector2(1, 0); uv[2] = new Vector2(0, 1); uv[3] = new Vector2(1, 1); return uv; }
想好这些东西,我们就开始定义面了。
源码奉上!
公用类!
using UnityEngine;using System.Collections;public class InitBase : MonoBehaviour { public static Vector3 [] initVertice(float width ,float height,float ancPointx,float ancPointY){ Vector3 [] viewVer = new Vector3[4]; viewVer [0] = new Vector3 (-ancPointx*-width,-ancPointY*height,0); viewVer [1] = new Vector3 ((1-ancPointx)*-width,-ancPointY*height,0); viewVer [2] = new Vector3 (-ancPointx*-width,(1-ancPointY)*height,0); viewVer [3] = new Vector3 ((1-ancPointx)*-width,(1-ancPointY)*height,0); return viewVer; }public static int[] initTri(){ int[] triangle = new int[6]; triangle [0] = 0; triangle [1] = 2; triangle [2] = 1; triangle [3] = 2; triangle [4] = 3; triangle [5] = 1; return triangle; } public static Vector3[] initNormal(){ Vector3[] normals = new Vector3[4]; normals[0] = -Vector3.forward; normals[1] = -Vector3.forward; normals[2] = -Vector3.forward; normals[3] = -Vector3.forward; return normals; } public static Vector2 [] initUV(){ Vector2 [] uv = new Vector2[4]; uv[0] = new Vector2(0, 0); uv[1] = new Vector2(1, 0); uv[2] = new Vector2(0, 1); uv[3] = new Vector2(1, 1); return uv; }}
物体上的类View
using UnityEngine;using System.Collections;[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))][ExecuteInEditMode]public class VKView : MonoBehaviour {Mesh viewMesh;Material viewDefultMat;bool isChange;[HideInInspector] public float ancPointx=0.5f,ancPointy = 0.5f;[HideInInspector] public int width = 100,height = 100;public string test;// Use this for initializationvoid Start () {viewDefultMat = new Material (Shader.Find ("VK/VKViewShader"));gameObject.GetComponent<MeshRenderer> ().sharedMaterial = viewDefultMat;viewMesh = new Mesh ();gameObject.GetComponent<MeshFilter> ().mesh = viewMesh;updateView();}public void updateView(){if (viewDefultMat != null) {viewMesh.vertices = InitBase.initVertice(width,height,ancPointx,ancPointy);viewMesh.triangles = InitBase.initTri();viewMesh.normals = InitBase.initNormal();viewMesh.uv = InitBase.initUV();}}#if UNITY_EDITORvoid OnDrawGizmosSelected(){Gizmos.color = Color.blue;Gizmos.DrawWireCube (transform.position,new Vector3(width,height,0f));}#endif}
view的编辑器类
using UnityEngine;using System.Collections;using UnityEditor;[CustomEditor(typeof(VKView))][ExecuteInEditMode]public class VKViewEditor : Editor {public override void OnInspectorGUI (){base.OnInspectorGUI ();VKView vkView = (VKView)target;//vkView.tex = EditorGUILayout.ObjectField ("Texture",vkView.tex,typeof(Texture),true)as Texture;vkView.width=EditorGUILayout.IntField("Width",vkView.width);vkView.height=EditorGUILayout.IntField("Height",vkView.height);vkView.test = EditorGUILayout.TextField("面板显示的名字:",vkView.test);vkView.updateView ();EditorUtility.SetDirty(vkView);EditorUtility.UnloadUnusedAssets();}}
还有shader
Shader "VK/VKViewShader" {Properties { _Color ("Main Color", Color) = (1,1,1,1) } SubShader { Pass { Cull Front Color [_Color] } }}
所有代码奉出,学习使用,不会的可以留言哦
0 0
- unity编辑器和插件(三)
- unity 编辑器和插件制作(五)
- Unity编辑器定制和开发插件
- unity编辑器和插件的制作(四.1)
- unity 编辑器和插件制作(四.2)
- [Unity]Unity3D编辑器插件扩展和组件扩展
- 【Unity&拓展编辑器&插件】开始插件,拓展编辑器教程
- unity插件和工具
- mac下unity shader编辑器sublime插件
- Unity编辑器拓展之三:拓展Unity的Hierarchy面板
- 【DoTween】Unity插件DOTween教程(三)
- Unity常用插件之DoTween(三)
- Unity插件 - MeshEditor(二) 模型网格编辑器(高级)
- Unity插件开发:基于Flux的技能编辑器
- Unity三维坐标系和编辑器简介
- 【Unity编辑器】Unity内置GUI风格和资源
- Unity编辑器
- unity编辑器
- C#三层架构
- Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml(转)
- OpenCV(四)图像的基本操作
- 内存对齐
- nginx的反向代理缓存
- unity编辑器和插件(三)
- Hibernate中Session的操作解释
- 黑马程序员—IO流(字节流)
- skills4study-How do we learn?
- 三国塔防游戏android源码
- ZigBee网络拓扑结构
- leetcode:N-Queens II
- sed 详细使用方法
- Tcp和Udp区别