接下来 我就开始正规的编辑器和插件的制作。
我这里是按照 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 initialization void 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_EDITOR void 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] } } }
所有代码奉出,学习使用,不会的可以留言哦
时间: 2024-10-26 21:29:11