unity3D技术之EditorGUI.DrawPreviewTexture 绘制预览纹理

合集下载

unity3d拓展编辑器Editor的使用

unity3d拓展编辑器Editor的使用

unity3d拓展编辑器Editor的使用Editor可以拓展Inspector窗口可以通过代码自己绘制监测面板先来看一个效果:1 using UnityEngine;2 using System.Collections;3 using UnityEditor;45 //Editor:使用这个为你的对象来创建自己的自定义检视面板和编辑器。

6 public class myScript : MonoBehaviour7 {8 /*9 [HideInInspector]10 * [SerializeField]11 * 意思是:隐藏数据在面板,并且序列化。

它可以帮我们永久保存数据,12 * 如果不加的话数值就会重置。

就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。

13 *14 * 比如一个属性希望被外部访问(必须是public)。

但不希望显示在检视面板中15 *16 * 那么就:17 * [HideInInspector]18 * public int s;19 *20 */2122 [HideInInspector]23 [SerializeField]24 Rect pRectValue;2526 public Rect PRectValue27 {28 get { return pRectValue; }29 set { pRectValue = value; }30 }3132 [HideInInspector]33 [SerializeField]34 Texture pTexture;3536 public Texture PTexture37 {38 get { return pTexture; }39 set { pTexture = value; }40 }4142 [HideInInspector]43 [SerializeField]44 private int a;4546 public int A47 {48 get { return a; }49 set { a = value; }50 }51 }5253 [CustomEditor(typeof(myScript))]54 class show : Editor55 {56 //在这里方法中就可以绘制面板。

unity3D技术之EditorGUIUtility.ObjectContent 物体内容

unity3D技术之EditorGUIUtility.ObjectContent 物体内容

static function ObjectContent (obj : Object, type : System.Type) : GUIContent Description描述Return a GUIContent object with the name and icon of an Object.返回一个GUIContent对象,带有名称和物体的图标。

【狗刨学习网】If the object is null, the icon will be picked according to type.如果obj为空,图标将拾取相关类型。

Object Content usage.使用的物体内容。

// Simple Editor Script that shows the icons of Transform, rigidbody, GameObject// and MonoBehaviour in 4 buttons.//在4个按【狗刨学习网】钮显示Transform, rigidbody,GameObject和MonoBehaviour的图标class EditorGUIUtilityObjectContent extends EditorWindow {@MenuItem("Examples/ObjectContent Usage")static function Init() {var window = GetWindow(EditorGUIUtilityObjectContent);window.Show();}function OnGUI() {EditorGUILayout.PrefixLabel("Select a type:");EditorGUILayout.BeginHorizontal();if(GUILayout.Button(EditorGUIUtility.ObjectContent(null,Trans form).image))DoSomething();if(GUILayout.Button(EditorGUIUtility.ObjectContent(null,Rigid body).image))DoSomething();if(GUILayout.Button(EditorGUIUtility.ObjectContent(null,GameO bject).image))DoSomething();if(GUILayout.Button(EditorGUIUtility.ObjectContent(null,MonoB ehaviour).image))DoSomething();EditorGUILayout.EndHorizontal();if(GUILayout.Button("Close"))this.Close();}function DoSomething() {Debug.Log("Hello there!");}}。

unity3d rendertexture 原理

unity3d rendertexture 原理

unity3d rendertexture 原理Unity3D RenderTexture原理Unity3D是一款功能强大的游戏引擎,其中的RenderTexture功能在游戏的图像渲染中起到了重要的作用。

RenderTexture允许开发者将3D场景或2D图像渲染到纹理上,以便后续的处理和使用。

RenderTexture原理基于帧缓冲对象(FBO)技术,它是一块专门用来存储图像渲染结果的内存区域。

在渲染过程中,Unity3D将场景的几何模型、贴图以及灯光效果等进行渲染,然后将渲染结果存储到RenderTexture中。

这个过程通常分为三个主要步骤:创建RenderTexture、渲染到RenderTexture、使用RenderTexture。

首先,我们需要创建一个RenderTexture对象。

在Unity3D中,可以通过代码或者在Inspector面板中的Renderer组件中设置来创建RenderTexture。

创建一个RenderTexture对象后,可以将其作为渲染目标使用。

一般情况下,会将其作为相机的渲染目标,这样相机就会将画面输出到这个RenderTexture中。

其次,我们需要将场景渲染到RenderTexture中。

在Unity3D中,可以通过相机对象来实现渲染到RenderTexture的功能。

将相机的targetTexture属性设置为之前创建的RenderTexture对象。

开发者可以通过代码控制相机的位置、旋转和其他属性,来获取需要的渲染效果。

在相机的渲染过程中,所有的几何模型、灯光、效果等都会被渲染到RenderTexture中,而不是默认的屏幕。

最后,我们可以利用RenderTexture实现各种后续处理和应用。

例如,可以将渲染到RenderTexture中的图像显示在游戏世界中的物体上,还可以将其作为贴图应用到其他模型的材质上。

此外,还可以将RenderTexture转化为纹理进行保存,或者通过GPU进行图像处理,如模糊、滤波等。

unity3d游戏开发之材质球、预设体镜头耀斑

unity3d游戏开发之材质球、预设体镜头耀斑

材质球(Material)的设置:
左键单击Assets-Create-Material(可直接把材质球拖拽给物体)
示例:设置颜色
设置贴图
材质球Shader->Bumped Diffuse法线视图
不要直接把图片拖拽到游戏对象上,否则会直接生成一个材质
所谓预设(Prefab)就是把一个对象设置好需要的属性,脚本等,然后拖拽到提前创建好的文件夹。

好处就是每次在需要它的时候直接使用就可以了,不用在重新创建,省时省力。

预设体的使用一般都需要代码实现
PS:随着添加的东西越来越的,我们要对其进行分类,把同一类的放在一个文件夹,方便以后查找
先导入Light Flares 耀斑资源包。

在场景中选择主摄像机,调整摄像机位置和角度,使其面对平行光源,在Game窗口中就能看到耀斑的效果了。

产生耀斑的两个条件:
摄像机添加了FlareLayer组件,把耀斑资源拖给平行光“Flare”属性中。

产生耀斑的太阳光需要在摄像机的范围内。

PS:耀斑效果只能被碰撞盒遮挡,对于实体模型无法遮挡这种效果。

这篇文章来自狗刨学习网。

Unity3D Editor类(Inspector)经验总结

Unity3D Editor类(Inspector)经验总结

Unity3D Editor类(Inspector)经验总结Posted on 2013年03月18日 by U3d / Unity3D 软件操作/被围观 235 次Unity3D Editor类(Inspector)经验总结。

1. Editor类中的全部控件描画,都是通过GUI完成的,所以不一定非要使用EditorGUILayout,使用GUILayout有时候更方便。

2. 因为1,所以我们可以使用GUI直接做一些完全自定义的描画。

例如在一张图片上画一个区域选择框。

3. Inspector光标定位Bug,具体表现为,代码无错误,无任何提示。

但Inspector 的编辑光标定位却不准。

我做了一些简单的测试:3.1 该问题与 Component 脚本(就是你写的类)的编写和 Editor 类(也就是 Inspector 的自定义类)的编写无关。

3.2 该问题的出现,似乎与编译缓存有关,出现问题后,我尝试过删除Assets同级目录下的obj文件夹(这个文件夹可以随意删除)或Library文件夹(删除这个会导致全部的关系链接丢失,需要手动恢复脚本间的挂接关系),之后重新打开Unity,Inspector光标正常了。

3.3 经过反复测试发现,该bug似乎和MeshFilter有关。

当你的Component中依赖了MeshFilter,但Mesh却是空,就会出现该bug。

例如:[RequireComponent(typeof(MeshCollider), typeof(MeshRenderer))]public class Test : MonoBehaviour{……}所以我将MeshFilter的添加,延迟到了Start中。

void Start(){// 没有在定义时直接添加 MeshFilter 的依赖关系,是因为,直接那么做会导致Editor出错。

// 虽然很诡异,但不清楚原因。

所以只有在Start中手动添加了。

Unity3D游戏开发之Texture图片空间和内存占用分析

Unity3D游戏开发之Texture图片空间和内存占用分析

Unity3D游戏开发之Texture图片空间和内存占用分析Texture图片空间和内存占用分析。

由于U3D并没有很好的诠释对于图片的处理方式,所以很多人一直对于图集的大小和内存的占用情况都不了解。

在此对于U3D的图片问题做一个实际数据的分析。

此前的项目都会存在这样或者那样的打包后包大小与内存占用情况的问题,所以这次所以彻彻底底得分析下U3D对于Texture的处理方式。

我打包多种类型的项目,空项目和10张放在Resources文件夹中的图为比较案例。

以下是比较数据。

文章出处【狗刨学习网】IPHONE:1.空项目—-空间占用量42.3MB—-IPA大小10MB2.10张1200*520无压缩Texure 单张图占用量2.8MB—-空间占用量70.2MB—-IPA大小22.9MB3.10张1200*520压缩成1024*1024PVRTC4 单张图占用量0.5MB—-空间占用量47.3MB—-IPA大小13.2MB4. 10张1024*1024无压缩Texture 单张图占用量4MB—-空间占用量82.3MB—-IPA大小14.6MB5.10张1024*1024压缩为PVRTC4格式单张图占用量0.5MB—-空间占用量47.3MB—-IPA大小11.6MB宗上数据总结:一、2的N次方大小的图片会得到引擎更大的支持,包括压缩比率,内存消耗,打包压缩大小,而且支持的力度非常大。

二、减小图片的占用大小和内存方式有:图片大小变化(Maxsize),色彩位数变化(16位,32位),压缩(PVRC)。

三、U3D对于图片的格式是自己生成的,而并不是你给他什么格式,他就用什么格式,一张1024*1024图在无压缩格式下,它会被U3D以无压缩文件形式存放,也就是说U3D里的Texture Preview里显示的占用大小**MB不只是内存占用大小,还是空间占用大小。

如下图所示:U3D的内部机制为自动生成图片类型来替换我们给的图片,在图片的压缩方式上需要进行谨慎的选择。

unity3d rendertexture 原理 -回复

unity3d rendertexture 原理-回复Unity3D的RenderTexture是一种用于在渲染过程中存储图像信息的技术。

它可以作为纹理贴图或者用于捕捉屏幕截图和实时渲染的数据。

RenderTexture的原理很简单。

当Unity进行渲染时,它首先将图形信息绘制到其中一个或多个RenderTexture中。

然后,将RenderTexture中的图像数据传输到屏幕上或者其他需要使用的地方。

RenderTexture可以用作纹理贴图在屏幕上显示,也可以用于离屏渲染,比如用于图像处理、特效、反射等其他用途。

首先,我们需要创建一个RenderTexture对象。

在Unity中,可以通过使用代码或者通过Editor界面来创建RenderTexture。

在代码中,可以使用`RenderTexture texture = new RenderTexture(width, height, depth, format, readWrite)`来创建一个RenderTexture对象。

其中,width和height是Texture的尺寸,depth决定了渲染纹理的位深度,format指定了图像的颜色格式(如RGBA32,ARGB32),readWrite决定渲染纹理是否可读写。

在Editor界面中,可以通过右击Hierarchy面板-> Create -> Render Texture来创建一个RenderTexture。

接下来,我们需要将RenderTexture设置为相机的目标渲染纹理。

在Unity 中,每个相机都有一个TargetTexture属性,用于指定该相机将图像输出到哪个RenderTexture上。

可以通过脚本或者在Inspector面板中设置TargetTexture属性来将RenderTexture绑定到相机上。

例如,在脚本中可以使用`camera.targetTexture = texture`来设置RenderTexture为相机的目标渲染纹理。

unity3d游戏开发之GUI的使用

阅读使人快乐,成长需要时间GUI是图形用户界面(Graphical User Interface)的缩写和简称,又叫图形用户接口。

听起来好像很专业的感觉,其实我们每天都在接触。

比如浏览器上面的前进、后退、收藏按钮、地址栏、右键菜单,甚至整个浏览器窗口都可以叫GUI。

而通常人们眼中的黑客高手,都是喜欢在一个全是字符的屏幕上啪啪啪飞快地键入一些晦涩难懂的字母,然后自称极其安全的某某防火墙系统就被攻破了。

这种界面正好与GUI 相对,叫做命令行界面,CLI(Command-Line Interface)。

作为次世代游戏引擎,制作的游戏当然不会用字符界面来显示各种信息。

虽然曾经的文字类的MUD游戏被誉为一代经典,MUD –Multiple User Domain,多用户交流领域,现在北大还开着此类游戏服务器。

但这样的游戏已经小众化了,并不符合人们日渐增长的对图形界面的高要求。

正如现在很少有家庭用户再用DOS/Linux系统了,Windows/MacOSX已经成了标配,甚至Linux都有了ubuntu,接下来还有可能是iOS、Android、Win8这类以触摸为主要操作的系统。

因此GUI组件就应运而生了,Unity中有两个常用的GUI组件,GUI Text 和GUI Texture。

顾名思义前者是用来显示文本的,后者则是用来显示贴图。

以魔兽世界里的头像为例,如果我们要制作这样的效果,那么玩家的名字和等级都可以用GUI Text来表现,而头像和血条,还有那些边框则都可以用GUI Texture来表现。

于是用Wow Model Viewer挖了半天,找到以下素材,准备开工山寨一个^_^。

∙原型头像一枚,懒得再上游戏里截图再修改了。

∙血条纹理一枚,游戏里的进度条都靠它来表现了。

∙头像框体一枚,嗯,它就是一个框而已。

∙等级框体一枚,嗯……同上。

将资源井然有序地分类存放是个良好的习惯,也是项目的第一步。

把这几个贴图全都拖到”Textures/GUI“目录下面,并选中它们把Texture Type更改为GUI(可以按住Ctrl 多选,一并更改)。

Unity3D入门之GUI基础以及常用GUI控件使用(2)

Unity3D入门之GUI基础以及常用GUI控件使用(2)using UnityEngine;using System.Collections;public class Cube1Control : MonoBehaviour {public Texture texture;public Texture2D texture2D;public Texture2D texture2DActive;public string userName;public string password;public string remark;public bool isSuccess;public int select=0;public bool toggle1 = false;public Texture2D bug1;public Texture2D bug2;public float h;public Vector2 vector2;Rect rect1 = new Rect(0, 10, 300, 500);Rect rect2 = new Rect(600, 10, 300, 500);public int selGridId = 0;string[] selString = new string[] { "Grid1", "Grid2", "Grid3", "Grid4", "Grid5" };// Use this for initializationvoid Start () {h = 40;}// Update is called once per framevoid Update () {}void win(int id){GUI.Button(new Rect(10, 120, 150, 50), "点击按钮");//使用DragWindow启用窗口拖动GUI.DragWindow();}void OnGUI(){#region GUILayout布局////GUILayout采用线性布局,类似于StackPanel,默认是纵向布局。

Unity3d内置图形界面系统(EditorGUI)

Unity3d内置图形界⾯系统(EditorGUI)⼀、说在前⾯的1、unity内置的ui系统,⽆论是在性能的表现上、功能的强⼤性上、制作复杂ui的便捷性上,还是其它的⼀些⽅⾯都不如⼀些第三⽅的插件来的好,如:NGUI和DF-GUI(PS: 后者⽐前者要好很哦,推荐!))。

2、虽然UnityGUI不如某些第三⽅的插件,但是它在做⼀些简单的测试上,做数据⾼度上还是要⽅便⼀些的;⽽且如果你要做Inspector的定制与Unity插件开发的话,UnityGUI你是绕不过去的哦。

所有⼤概熟悉⼀下UnityGUI还是必要的!3、关于UnityGUI的所有知识,在官⽅⽂档中的都有详细的介绍,在圣典上也有⼀⼀翻译。

我这⾥只是做⼀些简单的记录,也许有不对的地⽅,也许以后还会所补充!4、还有就刚接触这块时觉得UnityGUI相关API有点乱,觉得来必要记录⼀下。

⼆、GuiLayer组件是显⽰UnityGUI元素的必要组件,且必须附在⼀个相机对象上!不然你的UI是显⽰不出来的。

三、古⽼的组件1、这部分主要是和组件,是它们的基类,详参相应的链接。

2、GuiText以⽤来打印显⽰⼀些调试信息和简单的数据显⽰。

3、GuiTexture也在⽤来做⼀些简单ui部件或整个游戏画⾯的背景。

四、UnityGUI系统的分类这部分就⽐较复杂⼀些了。

1、⾸先它可以分成两个独⽴的部分:⾮Editor类与Editor类。

其中每部分中可以分成两个独⽴的部分:GUI系和GUILayout系。

其中的GUI系下的组件的名字基本上只⽤“GUI”开头,⽽GUILayout系下的组件的名字基本上是“GUILayout”开头的。

这样就有四个相对独⽴的UI系统了,这四个部分,每个拿出来都能相对完整个完成⼀个UI制做。

2、不同的是Editor类是⽤于编译器的制定与扩展⽅⾯,GUILayout系要⽐GUI系在功能上要强⼀点⽽以。

呵呵,是不是有点绕,有点乱,有点晕。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

static function DrawPreviewTexture(position: Rect, image: Texture, mat: Material= null, scaleMode : ScaleMode = ScaleMode.StretchToFill, imageAspect : float = 0) : void
Parameters参数
∙position
Rectangle on the screen to draw the texture within.
屏幕上绘制纹理的矩形区域
∙image
Texture to display. // 显示的纹理
∙scaleMode
How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.
当纹理的尺寸不适合这个区域时如何缩放
∙mat
Material to be used when drawing the texture.
当绘制纹理时使用的材质
∙imageAspect
Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.
用于源图片的纵横比。

如果为0(默认),使用源图片的纵横比
Description描述
Draws the texture within a rectangle.
在矩形内绘制纹理。

If mat is null (the default), an appropriate material will be chosen for a RGBM or doubleLDR lightmap or a normal map and the fallback blit material will be chosen otherwise.
如果mat为空(默认),一个适当的材料将被选择为RGBM或doubleLDR lightmap或者一个正常的贴图和背景材料,否则将使用被选择的材质
Preview Texture in an Editor Window.
编辑器中的预览纹理。

// Load a texture, display the texture, display its alpha channel and
// show a preview of the inverted texture
//加载并这个纹理,显示其Alpha通道,并显示该纹理的反向预览【狗刨学习网】
class EditorGUITextures extends EditorWindow {
var texture : T exture2D;
var invertedTexture : Texture2D;
var showInverted = false;
@MenuItem("Examples/Texture Previewer")
static function Init() {
var window = GetWindow(EditorGUITextures);
window.position = Rect(0,0,400, 200);
window.Show();
}
function OnGUI() {
texture = EditorGUI.ObjectField(Rect(3,3,200,20),
"Add a Texture:",
texture,
Texture);
if(GUI.Button(Rect(208,3, position.width - 210, 20),"Process Inverted")) {
if(invertedTexture)
DestroyImmediate(invertedTexture);
//Copy the new texture
//复制新的纹理
invertedTexture = new Texture2D(texture.width,
texture.height,
texture.format,
(texture.mipmapCount != 0));
for (var m : int = 0; m < texture.mipmapCount; m++)
invertedTexture.SetPixels(texture.GetPixels(m), m);
InvertColors();
showInverted = true;
}
if(texture) {
EditorGUI.PrefixLabel(Rect(25,45,100,15),0,GUIContent("Preview:"));
EditorGUI.DrawPreviewT exture(Rect(25,60,100,100),texture);
EditorGUI.PrefixLabel(Rect(150,45,100,15),0,GUIContent("Alpha:"));
EditorGUI.DrawTextureAlpha(Rect(150,60,100,100),texture);
EditorGUI.PrefixLabel(Rect(275,45,100,15),0,GUIContent("Inverted:"));
if(showInverted)
EditorGUI.DrawPreviewT exture(Rect(275,60,100,100),invertedTexture);
if(GUI.Button(Rect(3,position.height - 25, position.width-6,20),"Clear texture")) {
texture = EditorGUIUtility.whiteTexture;
showInverted = false;
}
} else {
EditorGUI.PrefixLabel(
Rect(3,position.height - 25,position.width - 6, 20),
0,
GUIContent("No texture found"));
}
}
function InvertColors() {
for (var m : int = 0; m < invertedTexture.mipmapCount; m++) {
var c : Color[] = invertedTexture.GetPixels(m);
for (var i : int = 0 ;i < c.Length; i++) {
c[i].r = 1 - c[i].r;
c[i].g = 1 - c[i].g;
c[i].b = 1 - c[i].b;
}
invertedTexture.SetPixels(c, m);
}
invertedTexture.Apply();
}
function OnInspectorUpdate() {
Repaint();
}
}。

相关文档
最新文档