unity编辑器和插件(三)

接下来 我就开始正规的编辑器和插件的制作。

我这里是按照 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]
        }
    }
}

所有代码奉出,学习使用,不会的可以留言哦

unity编辑器和插件(三),布布扣,bubuko.com

时间: 2024-10-26 21:29:11

unity编辑器和插件(三)的相关文章

unity编辑器和插件的制作(四.1)

好久没有更新,有些急事终于处理完了,接着更新博客! 废话不多说,接着上面的讲,今天我们来接着讲述. 前面说到 怎么去建立一个自己 ,用代码绘制一个色块,今天我们来讲述下,怎么绘制一个图片在场景里面. 首先 我们先做下图片的功课. 在unity中图片的种类分了很多,默认是:Texture, 还有其他的一些属性. 有些人可以会遇到 我放进去的素材为什么编译之后会变模糊那,这是由于,在unity中你没有修改图片的属性,导致的. 在 texture模式下, 我们来分析下这种图片的属性, wrap mod

unity 编辑器和插件制作(五)

接着前面的继续前行,默默的fighting. 前面讲了,怎么使用摄像机发射线到物体,来触发事件.今天我们 来讲述下怎么去实现一个label. 这个就相对比较简单了,其实我们可以直接使用unity自带得textmesh来实现一个字体,但大多数时候,需要改一些设置,字体大小,材质等等 一些得问题所以我们,最好还是自己写一个脚本来实现一些简单的操作,方便简洁嘛.其实很简单 ,下面我们就开始来实现这些方法. 代码 : using UnityEngine; using System.Collections

unity 编辑器和插件制作(四.2)

上次 我们讲述的是编辑器制作,怎么把图片加载到场景中,今天 我们就来讲述下,怎么 制作UIButton以及UIimage的互换. 废话不多说.进入正题. 首先我们要了解 unity的机制,button属性必须有的属性等. 首先 我们先说下 unity的机制: unity中检测点击事件,使用NGUI的可能知道,NGUI使用的就是SendMessage的方式来进行事件的传递.没错,这也是 unity最为简便的方式, (要注意一个问题哦,这个方式 如果 你要使用 大于 万次循环的话 会有延迟的哦,一般

unity编辑器xml数据库插件

unity编辑器xml数据库插件 程序和数据分离的意义我就不多说了,大家自己脑补或者百度.在使用unity开发时,数据的调试是非常频繁和重要的.我们可以制作一个简单的编辑器插件,将数据显示在Inspector面板上,并进行编辑操作.这样测试人员就可以非常方便的管理测试数据了. 需求很简单,具体的效果是,能读取资源内的类,将其属性显示在面板上,可以对此进行增删改查的操作.如下图所示(对象组,相当于数据库所有的表.对象,相当于表的所有记录). 当需要创建一条新记录的时候,先填上主键,然后点击创建按钮

关于Unity视频播放器插件 AVPro Video(三)360度全景视频播放

1.官网下载该插件或者我分享的链接: 链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf 2.拖入官方做好的预制体"360SphereVideo"或者"360CubeVideo"(两种不同的360度全景)到场景中,并将场景中的摄像机拖动到"Sphere"下方并Resert 3.设置"AVPro Video Media Player"上的Media Player 控制组件即可(具体操作参考&q

Unity编辑器扩展chapter1

Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些小的插件应用的项目工程中去,达到复用的目的.今天首先创建一个新场景生成的菜单项,生成的场景已经绑定好需要的游戏对象及脚本. Tips:1.官方API 2.编辑器扩展脚本都需放在Editor文件夹下,Editor的层级和数目没有要求 EditorUtil.cs :编辑器扩展类,向外部提供编辑器扩展方法

【VR】Leap Motion 官网文档 Unity资源与插件

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,本博客将推出针对Unity方向的官方文档翻译系列. 本篇首先对Leap Motion所提供的Unity资源与插件进行概述. 英文原文网址:https://developer.leapmotion.com/documentation/unity/index.html 译文首发&持续更新:http://blog.csdn.net/duzixi Leap M

Unity时钟定时器插件——Vision Timer源码分析之一

Unity时钟定时器插件--Vision Timer源码分析之一 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 因为项目中,UI的所有模块都没有MonBehaviour类(纯粹的C#类),只有像NGUI的基本组件的类是继承MonoBehaviour.因为没有继承MonoBehaviour,这也不能使用Update,InVoke,StartCoroutine等方法,这样就会显得很蹩脚.后来一个同事添加vp_Timer和vp_TimeUti

关于Unity中DOTween插件的使用(专题一)

DOTween flash里面的一个概念叫补间动画,DOTween就是干这个事情的. 补间动画:在1秒钟之内从A点移动到B点,在这个之间会把动画补间补好. 当我们安装好DOTween后,它就会提供很多补间的功能方便我们使用.当我们安装了这个插件以后,我们就可以快速使用代码来生成补间动画. 例子:赛车选择界面,旋转赛车后有一个慢慢回弹的动画效果. 安装DOTween1: 去网站http://dotween.demigiant.com/getstarted.php下载2: 将DOTween解压后复制