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

好久没有更新,有些急事终于处理完了,接着更新博客!

废话不多说,接着上面的讲,今天我们来接着讲述。

前面说到 怎么去建立一个自己 ,用代码绘制一个色块,今天我们来讲述下,怎么绘制一个图片在场景里面。

首先 我们先做下图片的功课。

在unity中图片的种类分了很多,默认是:Texture, 还有其他的一些属性。

有些人可以会遇到 我放进去的素材为什么编译之后会变模糊那,这是由于,在unity中你没有修改图片的属性,导致的。

在 texture模式下,

我们来分析下这种图片的属性,

wrap mode 这个是图片选择 图片时候四方连续是会用到,也可以减轻,图片白边的影响。

filter mode 是 图片的 文件模式,说白一点就是 点,两角线,三角线。。越高图片质量越大,内存也就越高。

anise level 说白了 这个 我还没用到 ,貌似是位图才会用到。

max size 最大支持图片(注意哦是最大哦,假如我的图是100*100的 你选择1024 没关系的 不会浪费 内存的,因为这里说的是最大的图集支持,如果你的图片超过了1024,那这个值也要跟着变。)

format 这个就是 压缩模式了,决定内存的最重要的部分,三个选项,自动压缩(最节省),16位压缩(还可以说的过去),真彩色可以说没有压缩,保证质量的同时内存相应的增大了。

高级选项模式:最为常用的模式。

Non power of 2 :如果你不想你的图变成 正方形符合2的n次方的图,就选择none,这样可以保证你图的大小的合理性。不然选自动适应,最大适应,最小适应。

cubemap: 一般不使用,这个是用在模型上面的贴图。

read/w:是否支持读写,建议勾选。

其他看下文档。

format:一般我们用32位的,也可以选择16位的。减少内存。

最后 送一句话,小图尽量拼成大图,对UV(也可以使用NGUI的自动压缩图,也可以自己压缩,后面会讲怎么制作自己的图集),大图最好不要超过1024,面的数量尽量的减少,尽量使面合并。 目的减少内存,减少drawcall。

好,下一步。我们开始做把图片渲染到场景里面。

前面讲了,我们绘制片,下面,我们做的之需要两部。

1.把shader换掉,前面使用的是,纯色的shader,下面我们将使用,带贴图的shader。

2. 前面我们使用的是固定的宽和高,因为图片的大小不是固定的,所以我们要把比例进行适配一下。

上代码:

shader部分,很简单:

Shader "VK/VKTextureShader" {
    Properties {
        _Color ("Main Color", COLOR) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D) =""{}
    }
     SubShader {
     Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

        Pass {
         Blend SrcAlpha OneMinusSrcAlpha
            Cull off
         SetTexture [_MainTex] {
             constantColor [_Color]
               Combine texture *constant
         }
        }
    }
}

调用前面的,绘制片的公用方法类InitBase,继承VKview ,前面已经有,复制就好。

using UnityEngine;
using System.Collections;

public class VKImageView : VKView {

	Material imgViewDefultMat;
	Mesh imgViewDefultMesh;
	[HideInInspector] public Texture imgViewTex,highLightedTex;
	[HideInInspector] public float scale =1;
	[HideInInspector] public string info= null;
	[HideInInspector] public bool highLighted  = false;
	[HideInInspector] public float alpha =1;

	// Use this for initialization
	void Start () {
		imgViewDefultMat = new Material (Shader.Find("VK/VKTextureShader"));
		imgViewDefultMesh = new Mesh ();
		GetComponent<MeshFilter> ().mesh = imgViewDefultMesh;
		GetComponent<MeshRenderer>().material = imgViewDefultMat;
		updateImageView ();
	}

	public void updateImageView(){
		if(imgViewTex!=null){
			if(!highLighted){
				if(imgViewDefultMat!=null)
					imgViewDefultMat.mainTexture = imgViewTex;
				if(imgViewDefultMesh!=null)
					imgViewDefultMesh.vertices = InitBase.initVertice(imgViewTex.width *scale,imgViewTex.height*scale,ancPointx,ancPointy);

				height = imgViewTex.height;
				width = imgViewTex.width;
			}else{
				if(imgViewDefultMat!=null)
					imgViewDefultMat.mainTexture = highLightedTex;
				if(imgViewDefultMesh!=null)
					imgViewDefultMesh.vertices = InitBase.initVertice(highLightedTex.width *scale,highLightedTex.height*scale,ancPointx,ancPointy);

				height = highLightedTex.height;
				width = highLightedTex.width;
			}

		}else{
			if(imgViewDefultMat!=null)
				imgViewDefultMat.mainTexture = null;
			if(imgViewDefultMesh!=null)
				imgViewDefultMesh.vertices = InitBase.initVertice(width*scale,height*scale,ancPointx,ancPointy);
		}
		if(imgViewDefultMat!=null){
			Color newcolor = imgViewDefultMat.color;
			imgViewDefultMat.color = new Color(newcolor.r,newcolor.g,newcolor.b,alpha);
		}
		if(imgViewDefultMesh!= null){
			imgViewDefultMesh.triangles = InitBase.initTri ();
			imgViewDefultMesh.normals = InitBase.initNormal();
			imgViewDefultMesh.uv = InitBase.initUV();
		}
	}

	public void switchButton(){ //后面会讲到,可以先删掉,这个是转化按钮来用的。
		VKButton button = gameObject.AddComponent<VKButton> ();
		button.buttonDefultMesh = imgViewDefultMesh;
		button.buttonDefultMat = imgViewDefultMat;
		button.buttonTex = imgViewTex;
		button.pressButtonTex = highLightedTex;
		button.info = info;
		button.scale = scale;
		button.ancPointx = ancPointx;
		button.ancPointy = ancPointy;
		button.updateButton ();
		DestroyImmediate (GetComponent<VKImageView>());

	}
}

Editor下面的 编辑器类

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(VKImageView))]
public class VKImageViewEditor : Editor {

    public override void OnInspectorGUI ()
    {
        base.OnInspectorGUI ();

        VKImageView imgView = (VKImageView)target;
        imgView.imgViewTex = EditorGUILayout.ObjectField  ("ImageTexture",imgView.imgViewTex,typeof(Texture),true)as Texture;
        imgView.highLightedTex = EditorGUILayout.ObjectField  ("HighLightedTex",imgView.highLightedTex,typeof(Texture),true)as Texture;

        imgView.alpha = EditorGUILayout.Slider("Alpha",imgView.alpha,0.0f,1.0f);
        imgView.highLighted = EditorGUILayout.Toggle ("highLighted",imgView.highLighted);

        imgView.info = EditorGUILayout.TextField ("info",imgView.info);
        imgView.ancPointx = EditorGUILayout.Slider("AnchorX",imgView.ancPointx,0.0f,1.0f);
        imgView.ancPointy = EditorGUILayout.Slider("AnchorY",imgView.ancPointy,0.0f,1.0f);

        if(imgView.imgViewTex == null){
            imgView.width=EditorGUILayout.IntField("Width",imgView.width);
            imgView.height=EditorGUILayout.IntField("Height",imgView.height);
        }
        GUILayout.BeginHorizontal();
        if(GUILayout.Button("2X")){
            imgView.scale = 0.5f;
        }
        if(GUILayout.Button("1X")){
            imgView.scale = 1f;
        }
        if(GUILayout.Button("1.5X")){
            imgView.scale = 0.75f;
        }
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        if(GUILayout.Button("ChangeName")){
            if(imgView.imgViewTex!=null){
                imgView.name = imgView.imgViewTex.name;
            }
        }
        if(GUILayout.Button("SwitchButton")){
            imgView.switchButton();
        }
        GUILayout.EndHorizontal();

        imgView.updateImageView();
        if(imgView!=null)
            EditorUtility.SetDirty (imgView);
        EditorUtility.UnloadUnusedAssets ();
    }

}

较多,第一部分先讲到这里。下次接着,不会的或看不懂可以留言哦,学习,喷子请绕路,谢谢。

unity编辑器和插件的制作(四.1),布布扣,bubuko.com

时间: 2024-12-21 11:57:24

unity编辑器和插件的制作(四.1)的相关文章

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

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

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

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

unity编辑器和插件(三)

接下来 我就开始正规的编辑器和插件的制作. 我这里是按照 IOS android的 控件为例子模板.来制作 一套使用 unity书写的控件. 好首先我们来想下  IOS 和android的 控件都是以四边形基础的. SO, 接下来 我们来转像unity,在unity中 我们怎么去建立一个四边形那, 依照图形绘制的原理.三点一面的理论.我们可以使用6个点来建立一个两三角形组成的四边形. 我们先学会怎么去绘制一个view,也就是简单的一个色面. 我们知道 unity中得面也是采取这种的绘制方法,绘制

unity编辑器xml数据库插件

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

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

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

Unity编辑器扩展chapter1

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

【Unity】Mesh网格编程(四)麦比乌斯环

前言 事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环. 其实这个早就想做了,还是轻松下来的时候思绪转的快. 不废话,先看效果: 博文首发:http://blog.csdn.net/duzixi 工程资源准备: 1. 本脚本要放在Editor文件夹下 2. 在资源中有一个空对象,作为顶点预设体,创建时要引入 3. 在Resources文件夹下有一个材质,叫"M" 源代码: using UnityEngine; using UnityEditor; using System.

【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的NGUI插件篇——入场效果

Unity的NGUI插件篇--入场效果 入场效果 入场效果需要借助于NGUI提供的TweenPosition类来完成,为了说明此类的使用方法,本节将使会讲解两个示例.本文选自  大学霸 <NGUI使用手册>  一书 匀速入场 将游戏主菜单看作一个整体,本小节会令其自上而下匀速入场,具体的实现过程如下: (1)在Project视图里,新建一个C#脚本,命名为AppearFromAbove,为其添加下面的代码: 01     using UnityEngine; 02     using Syst