2013-07-12 18:55:10 ldghd 阅读数 7942






【AssetStore经验分享】今天遭吓到了。。

 
楼主#
更多发布于:2013-02-27 22:31
自己做的插件Xffect Editor Pro ,去年8月放到AssetStore上卖,75美刀一份,断断续续每个月也可以卖10来份。。这份收入对我来说已经很可观了,没有祈求更多了。。

直到上周那边发个邮件问我需不需要做减价促销,起初我并没怎么在意,随口回了句yes, I'd like to。

今天因为月底了,心血来潮登陆上去看了下。。。如图:


幸福来得太突然。。。收入居然挤上头版了。。。而且这短短24小时的收入已经远远超过之前6个月收入的总和了。。

这尼玛,营销很重要啊,AssetStore虽然比不上AppStore,但是至少Unity也号称有几十万开发者啊。

我这一个人做的破玩意都卖成这样(现在还在努力完善中),而且实际上unity大部分开发者都来自咱china,鼓励大家也出售自己的劳动成果,可能盈利未必比AppStore少哦。








[插件]特效插件Xffect Editor Pro,圣典独家发布(版本更新至3.2.0)

 
楼主#
更多发布于:2012-07-16 17:34
Unity官方论坛讨论帖 | Asset Store Link 
Xffect Editor Pro是一款功能强大的特效编辑器,其中内置了一套全新的粒子系统和各种各样的专业特效例子,通过它,你可以非常方便地制作专业级的游戏特效。 
产品展示: 
WebPlayer 
产品概述: 
Xffect Editor Pro是一款专为Unity开发的特效插件,C#编写,提供所有源码。 与Unity内置的粒子系统相比,Xffect更适合游戏特效,使用上也更为方便,因为它所提供的粒子系统实际上并不是传统意义上的“粒子”系统, Xffect的粒子更为多样化一些,包括Sprite,RibbonTrail,Cone等常用游戏特效元件。而且它的模块架构也非常简单:一个粒子发射器提供粒子;每个粒子都有各种各样的可供选择的修改器来影响他们的各种属性:旋转,大小,速度,颜色,贴图坐标等;最后由一个Mesh来渲染所有这些粒子。那么它的性能怎么样呢,与unity内置的特效系统相比如何?我可以非常肯定地说:“在通常情况下,他们的性能没有差别“。因为在游戏特效里面,一个非常绚丽精美的特效也不会超过100个粒子,普通特效20-50个粒子足够。在这种数量下,Xffect的性能表现和内置粒子系统无异。当然,如果你是想用粒子系统模拟一些仿真物理,而他们的粒子数一般都会超过500个,那么我建议你还是使用内置的粒子系统。 
产品特点: 
    [*]完全集成与unity编辑器 
    [*]可以在编辑器内更新,实时展现效果 
    [*]完全独立于unity自带粒子系统,并提供了一套全新的粒子系统 
    [*]粒子系统支持碰撞检测 
    [*]集成了非常多的粒子修改器:气流,引力,漩涡,动荡等3dMax常用粒子修改器 
    [*]非常好的性能 
    [*]提供了非常多的专业特效例子,直接拖拽到你的工程中即可复用 
    [*]新版本支持消息系统,配合使用可以达到次世代游戏的效果! 
    [*]支持Mobile 
    [*]持续更新
免费版下载: 
点击下载,目前版本2.0.0!,支持编辑器内更新,新增免费特效! 
  
该版本的功能会有所限制,提供的特效例子也较少,如果你觉得有用,请购买专业版。 
产品支持:
 
暂时提供了一个简陋的论坛:http://shallway.net/forum.php?mod=forumdisplay;fid=38 
或者联系作者邮箱:shallwaycn@gmail.com 
如果有好的建议,或者特效需求,欢迎与我联系 

2.0视频: 




















 


  
产品购买: 
老用户注意一下,版主暂时把权限转不过来,所以请大家还是去团购区下载,那里也会一直保持更新的。 
 新用户请在这里购买,价钱高了很多。因为如果价格比Asset Store上低太多,作者怕会引起一些不必要的麻烦。 
 另,该价格可能还会涨,因为作者还在继续更新。 

版本更新至2.3.0,新增加: 
1,Camera Radial Blur Mask  Event,可以使用在手机上,效果如下: 
 
2,新增加API教程,在文件夹Tutorial下。 


3.0.0 
重写了UI,新增加了Color Gradient Editor,新增加了Glow Per Obj效果。 
升级须知: 
这次的版本需要对之前老的Xffect Obj打补丁,请点击Window/Xffect/Patch/Ver3.0.0/Patch Current Project 菜单,对当前项目目录下的所有Xffect Obj打补丁,或者你也可以手动选择某个Obj,点击Window/Xffect/Patch/Ver3.0.0/Patch Selected Object 仅对该Obj打补丁。 


3.0.1 
修复了颜色渐变窗口的一些崩溃Bug。窗口属性也改为永远在最前了。 


3.0.2 
修复了颜色渐变窗口消耗CPU过高的问题。 


3.0.3 
修复了Unity4 下 Scale Curve无法编辑的问题 


3.1.0 
新增加"Sub Emitters"模块, 新增加"Glitch" Image Effec, 
*新增加了Scale 和 Rotation的 Curve编辑器,该版本的曲线编辑器在使用上更方便了。 















Strumpy Shader Editor入门教程  

2012-08-27 00:13:53|  分类: Unity教程 |  标签:unity  阿赵  strumpy  shader  即时反射  |字号 订阅

      对于3D游戏来说,有很多绚丽的效果,都是靠shader(着色器)来实现的。不过很多朋友估计都不会编写shader,阿赵我自己也只是看了个入门,明白了它的原理,很多具体的效果都写不出来的。这次来介绍一个Unity3D的第三方shader编辑器:Strumpy。这个编辑器是完全可视化编辑,使用起来相对简单一点。

先来看看我们这次需要做的例子:

Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
我们需要使用Strumpy,编辑出这样一个shader:包括了漫反射通道、法线通道、高光通道,以及在模型的边缘运动的光效。
很显然,Unity3D自带的shader没有能直接实现这样的功能的,最多也只能使用法线和高光通道而已。
 
      由于这个例子稍微复杂,所以我们先来做一个更简单的例子,来熟悉一下strumpy的界面和基本操作。
 
首先肯定是要先下载Strumpy插件了。在Asset Store里面有,免费下载的。我这里使用的是4.0a版本。
下载完之后导入,会看到多了一个选项:
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
 
选择之后打开了Strumpy的编辑窗口: 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
Flie的功能很直观,新建,读取,保存和导出的功能,我们可以先看看读取功能
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
插件自带了一些已经编辑好的范例,有兴趣的朋友可以逐个看看,会有很大的收益。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
然后我们来正式开始做这个简单的例子,我们准备了一张带有透明通道的贴图(拿斩首大刀的阿赵),接下来我们做一个shader,把这张贴图显示在一个面片上面,使它实现漫反射通道和透明通道的显示。
 
我们新建一个着色器编辑: 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 注意看,新建时,在Settings的标签是红色的,然后Shader Name也是红色的,这是提醒我们,每一个shader必须要先有一个名称,而这个名称就是以后你在材质栏里面选择的材质名称了。比如你可以用“myshader/test”,这样test材质会出现在myshader下面。
 
 
输入材质名词之后,我们先来Inputs里面,新建一个输入。这个输入,就是我们平常在Unity自带的材质球里面看到的输入通道了。假如我们需要它能调节颜色,那么就要新建一个颜色的输入,假如需要调用贴图,就要新建一个贴图的输入。这里我们新建一个Unity预设的MainTexture。熟悉用脚本替换材质贴图的朋友估计很熟悉这个标签的含义了。
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
新建之后,我们可以看到,出现了一个贴图选择的通道,就像我们平常操作的自带材质球一样。
 
接下来我们会新建一些节点,然后对他们进行编辑。
创建节点的方式有两种:
第一种是在Nodes里面选择相应的节点:
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
第二种是在节点编辑的窗口鼠标右键单击,选择相应的节点。 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
我个人比较习惯第二种方法。
 
我们选择了一个Sampler2D的输入 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
刚生成的时候,这个节点是红色的,因为我们没有指定输入的来源。想起刚才我们新建的Input了吧?那个MainTexture指定在这里。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
在选中该节点的情况下,来到Node的标签,会看到提示错误了
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
我们选择_MainTex
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
这时候,节点就不再是红色了,而是出现了两项输出,分别是2D采样和UV信息。节点名称里面,也会相应的显示出_MainTex,也就是我们刚才新建的Input的名称。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
接下来我们新建一个Tex2D方法节点。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
然后像上图一样,用鼠标把他们之间连起来。
 
 这时候,把我们预先准备好的贴图指定在贴图通道里面
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
点击预览窗口的Update Preview,会看到预览的物体上面出现了我们的贴图
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
为了便于观察,我们选择一个片面模型。这时候,漫反射通道已经完成了,接下来我们继续做透明通道。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
如上图一样,把A连接到Alpha通道。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
然后来到Settings,按上图设置一下。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
打开背景显示,会看到透明通道已经生效了。
 
在完成了以上的小例子之后,我们正式来解释一下Strumpy各个部分的意思吧。 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
在master里面,分别是各个通道的最终输出。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
节点是通过有方向性的线条来连接的,分为输入端和输出端,上图是一个单向输入输出的例子。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
再来是一个运算的例子,Add是相加的操作,这里是两个输入端进入了相加,然后输出一个结果。
在这里要说明一下的是,这些操作很大一部分都是数学运算的方法,比如加减乘除、sin、cos之类,各位在学习之前最好要先理解他们的意思。比如相加就是互相叠加,两张图相加会整张图都变得更亮。相乘是波峰波谷的叠加,两张图相乘,会使亮的地方更亮,暗的地方更暗。其他的方法请各位自行百度去查阅了,就不一一说明。
 
再来看看设置的选项 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
如果曾经自己写过shader的朋友,对于这些选项应该是很熟悉的。比如很多朋友问的双面显示,其实就是把CullMode选择为Off就行。
 
 
介绍完基本功能,我们正式的来做这次的目标例子了。 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
这里我们准备了一个模型。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
模型带有了漫反射贴图和法线贴图。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
首先新建一个着色器编辑,然后给shader起名为:myShader
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
按照第一个例子的操作,我们完成了漫反射通道。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
为了应用在我们的模型上,我们需要先生成一个shader。选择导出(Export As)
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
给shader起一个文件名。这个名称没有太大的意义。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
导出之后,我们来到材质球选择的地方,会看到了我们新建的myShader,选择它。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
然后指定漫反射贴图,我们的模型变成了上图的效果。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
接下来,我们在Inputs里面新建一个凹凸贴图的输入
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
然后完成法线通道节点的编辑。由于需要使用法线贴图,所以需要加入一个UnPackNormal的节点。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
这时候,我们会发现输入通道处多了Normalmap通道,我们把法线贴图赋予上去。模型变成上图的效果。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
我们再新建一个颜色输入,作为高光的颜色。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
完成高光通道和光泽强度的节点编辑。
这里我用了一个Multiply(相乘),目的是让光泽强度范围的对比度更大,显得高光会更尖锐一点。高光颜色直接连接到Specular通道。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
现在我们的模型已经拥有了一定的质感了。由于模型原来是没有法线贴图的,我拿了漫反射贴图来直接转换,所以效果差了点,有兴趣的朋友可以自己做法线贴图增强效果。
 
接下来做有动画效果的光。
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
我们新建了几个输入:发光颜色(_LightColor),一个发光颜色的遮罩贴图(_Light),一个浮点(_dir)作为光运动的方向,一个范围选择(_RimPow)作为发光强度的控制。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
这张是发光遮罩贴图,是一张黑白的梯度图。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
这一个步骤的节点编辑有点复杂,基本的思路是将颜色和遮罩贴图混合在一起,并用时间控制UV动画:
1、遮罩贴图我用了ViewDirection和Fresnel结合控制显示方向,并用_RimPow作为显示方向的次幂控制显示强度。
2、为了让光会随着时间自己做动画,我是用来Time和_dir相乘,这样可以控制动画的速度和方向。
3、为了让UV移动做动画,我用了UV_Pan。记得UV_Pan需要选择输入的轴,这里我选择了Y轴。
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
 
4、最后,我把发光颜色和遮罩运算的结果相乘,达到叠加波峰改变颜色的目的。
 
Strumpy Shader Editor入门教程 - 阿赵 - 有爪的小羔羊阿赵
最后,发布shader,根据需要选择相应的遮罩贴图,指定发光的颜色、强度和方向,我们的例子就完成了。
 
补充说明几点:
1、可能很多功能自带的shader都有,不过有时候你就是会需要一些功能特殊一点的shader,具体需要什么输入通道,和怎样的操作,请根据实际情况考虑。
2、关于即时镜面反射的shader,估计很多朋友都很感兴趣。不过我这里不打算详细介绍,因为unity没有直接即时反射运算的shader。
简单说明一下其原理:
在自带的水面和愤怒机器人场景里面,我们都看到了类似镜面反射的效果,其实这都是一种欺骗。做法不算复杂,其实是根据了当前摄像机的位置,新建了一个相对角度的反射摄像机,并把反射摄像机看到的内容渲染成RenderTexture。最后把RenderTexture和位置矩阵输入到普通材质的贴图通道,达到好像即时反射的效果。水面的例子做法会傻一点,因为它是针对水面物体自己生成了一个反射摄像机,所以的反射效果只会对水面本身有效果,

2016-05-11 17:11:45 qq_27361571 阅读数 825

General 一般

  • Auto Refresh 自动刷新
    Should the editor update assets automatically as they change?
    当资源改变时,编辑器自动更新资源。
  • Always Show Project Wizard
    总是显示项目向导
    Should the project wizard be shown at startup? (By default, it is shown only when the alt key is held down during launch)
    在启动时,显示项目向导吗?(默认,当软件启动时,长按Alt键时启动)
  • Compress Assets On Import
    在导入时压缩资源
    Should assets be compressed automatically during import?
    在导入时,资源自动被压缩吗?
  • OSX Color Picker
    OSX拾色器
    Should the native OSX color picker be used instead of Unity's own?
    用本地OSX拾色器替代Unity的吗?
  • Editor Analytics
    编辑器分析
    Can the editor send information back to Unity automatically?
    编辑器能自动发送信息返回给Unity吗?
  • Verify Saving Assets
    保存资源核实
    Should Unity verify which assets to save individually on quitting?
    在退出时,核实哪个资源单独保存吗?
  • Skin (Pro Only)
    皮肤(仅专业版)
    Which color scheme should Unity use for the editor? Pro users have the option of dark grey in addition to the default light grey.
    Unity编辑器应该使用哪个颜色主题?专业版用户除了默认的浅灰色,还有深灰色的选项。

External Tools 外部工具

  • External Script Editor
    外部脚本编辑器
    Which application should Unity use to open script files?
    Unity应该使用哪个应用程序来打开脚本文件?
  • Editor Attaching
    编辑器附加
    Should Unity allow debugging to be controlled from the external script editor?
    Unity应该允许从外部脚本编辑器来调试控制吗?
  • Image Application
    图片应用程序
    Which application should Unity use to open image files?
    Unity应该使用哪个应用程序来打开图片文件?
  • Asset Server Diff Tool
    资源服务器比较工具
    Which application should Unity use to resolve file differences with the asset server?
    Unity应该使用哪个应用程序来比较资源服务器的文件异同?
  • Android SDK Location 
    Android SDK 位置
    Where in the filesystem is the Android SDK folder located?
    Android SDK文件夹在系统的哪个地方?
  • iOS Xcode 4.x support
    iOS Xcode 4.x 支持
    Should support for Xcode 4.x be enabled for iOS build targets?
    启用支持Xcode 4.x为iOS编译目标吗?

Colors 颜色

This panel allows you to choose the colors that Unity uses when displaying various user interface elements.

这个面板让你选择颜色来修改界面元素的颜色。

Keys 快捷键

This panel allows you to set the keystrokes that activate the various commands in Unity.

这个面板可以设置Unity不同命令的快捷键。

Cache Server 缓存服务器

  • Use Cache Server
    使用缓存服务器
    Should the cache server be enabled?
    启用缓存服务器吗?
  • IP Address
    IP地址
    IP address of the cache server, if enabled
    如果启用,缓存服务器的IP地址。
2017-01-05 15:05:09 pz789as 阅读数 4489

参考:http://blog.csdn.net/pz789as/article/details/54093140


在网上看到很多资料,都是用的以前老的属性了,强迫症发作,只好自己动手将过期的属性都改了

本来是方法我是从网上找的,自己懒得去解析fnt文件了,于是想到了以前用的NGUI就有专门处理fnt文件的类,于是就下了一个最新的NGUI,把里面的这几个类拷贝了过来:



然后自己写了一个类,显示在unity的菜单栏里面:


需要把这个文件放到Editor下面才会起作用!

然后看实现:

//本方法是通过BMFont导出的fnt和字体图片来导出字体文件的,使用时,只需要选择图片或者fnt文件即可,但是图片和字体文件的名字必须要保持一致,除了后缀名。
	//如果不一样,则将两个文件都选中,导出的名字以最后选择的文件为基准,但是推荐把他们的名字统一,预防出现差错。
	[MenuItem("Assets/CreateMyFont")]
    static void CreateMyFont(){
		if (Selection.objects == null) return;
		if (Selection.objects.Length == 0) {
			Debug.LogWarning("没有选中fnt文件,或者图片文件");
			return;
		}
		//至少需要保证选中文件的目录下面有fnt文件,否则不会生成字体
		Font m_myFont = null;
		TextAsset m_data = null;
		string filePath = "";
		Material mat = null;
		Texture2D tex = null;
		bool bln = false;
		//不管选中fnt、png、mat、fontsettings其中的任何一个,都可以创建字体
		foreach(UnityEngine.Object o in Selection.objects){
			if (o.GetType() == typeof(TextAsset)){
				m_data = o as TextAsset;
				bln = true;
			}else if (o.GetType() == typeof(Material)){
				mat = o as Material;
				bln = true;
			}else if (o.GetType() == typeof(Texture2D)){
				tex = o as Texture2D;
				bln = true;
			}else if (o.GetType() == typeof(Font)){
				m_myFont = o as Font;
				bln = true;
			}
			if (bln){
				filePath = AssetDatabase.GetAssetPath(o);
				filePath = filePath.Substring(0, filePath.LastIndexOf('.'));
			}
		}
		//获取fnt文件,我们在这里加一次判断,为了可以直接选择图片也能导出字体
		string dataPathName = filePath + ".fnt";
		if (m_data == null){
			m_data = (TextAsset)AssetDatabase.LoadAssetAtPath(dataPathName, typeof(TextAsset));
		}
		if (m_data != null){
			string matPathName = filePath + ".mat";
			string fontPathName = filePath + ".fontsettings";
			string texPathName = filePath + ".png";

			//获取图片,如果没有图片,不影响,可以生成之后,再手动设置
			if (tex == null){
				tex = (Texture2D)AssetDatabase.LoadAssetAtPath(texPathName, typeof(Texture2D));
			}
			if (tex == null){
				Debug.LogWarning("没找到图片,或者图片名称和fnt文件名称不匹配");
			}

			//获取材质,如果没有则创建对应名字的材质
			if (mat == null){
				mat = (Material)AssetDatabase.LoadAssetAtPath(matPathName, typeof(Material));
			}
			if (mat == null){
				mat = new Material(Shader.Find("GUI/Text Shader"));
				AssetDatabase.CreateAsset(mat, matPathName);
			}else{
				mat.shader = Shader.Find("GUI/Text Shader");
			}
			mat.SetTexture("_MainTex", tex);

			//获取font文件,如果没有则创建对应名字的font文件
			if (m_myFont == null){
				m_myFont = (Font)AssetDatabase.LoadAssetAtPath(fontPathName, typeof(Font));
			}
			if (m_myFont == null){
				m_myFont = new Font();
				AssetDatabase.CreateAsset(m_myFont, fontPathName);
			}
			m_myFont.material = mat;

			BMFont mbFont = new BMFont();
			//借助NGUI的类,读取字体fnt文件信息,可以不用自己去解析了
			BMFontReader.Load(mbFont, m_data.name, m_data.bytes);
			CharacterInfo[] characterInfo = new CharacterInfo[mbFont.glyphs.Count];
			for(int i=0;i<mbFont.glyphs.Count;i++){
				BMGlyph bmInfo = mbFont.glyphs[i];
				CharacterInfo info = new CharacterInfo();
				//设置ascii码
				info.index = bmInfo.index;
				//设置字符映射到材质上的坐标
				info.uvBottomLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvBottomRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvTopLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				info.uvTopRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				//设置字符顶点的偏移位置和宽高
				info.minX = bmInfo.offsetX;
				info.minY = -bmInfo.offsetY-bmInfo.height;
				info.maxX = bmInfo.offsetX+bmInfo.width;
				info.maxY = -bmInfo.offsetY;
				//设置字符的宽度
				info.advance = bmInfo.advance;
				characterInfo[i] = info;
			}
			m_myFont.characterInfo = characterInfo;
			EditorUtility.SetDirty(m_myFont);//设置变更过的资源
			EditorUtility.SetDirty(mat);//设置变更过的资源
			AssetDatabase.SaveAssets();//保存变更的资源
			AssetDatabase.Refresh();//刷新资源,貌似在Mac上不起作用

			//由于上面fresh之后在编辑器中依然没有刷新,所以暂时想到这个方法,
			//先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了
			//这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉
			AssetDatabase.ExportPackage(fontPathName, "temp.unitypackage");
			AssetDatabase.DeleteAsset(fontPathName);
			AssetDatabase.ImportPackage("temp.unitypackage", true);
			AssetDatabase.Refresh();

			Debug.Log("创建字体成功");
		}else{
			Debug.LogWarning("没有找到fnt文件,或者文件名称和图片名称不匹配");
		}
    }

代码也没什么可以说的,上面都带了注释。

主要改动是在计算uv和vert这里了,因为新版本建议不要使用uv和vert,改用uvLeftTop等等~也要跟着进步嘛~

我自己还加入了文件判断,这样可以根据你选择的文件进行字体生成过程,但是在文件夹目录下方必须要存在fnt文件,否则无法导出字体。

这里我在最后多做了一步,本来按照Unity的逻辑,我设置了SetDirty之后,这个资源理论上说应该会刷新的,但是我在实际使用的时候,每次导出完毕没有错误,但是.fontsettings的文件并没有改变。后面在多次尝试之后发现,如果将生成的字体导出成package,然后再导入进来或者关闭unity重新打开,这个就能正常使用。所以在最后我又添加了自动导出导入,最后完成之后,只要点一下import就可以使用新制作的字体了。

上面这个问题是5.5 的 mac版本上出现的,不知道windows版本会不会有这个问题,不过无关紧要,这么写两遍都能够使用~

2018-07-30 14:59:02 yu__jiaoshou 阅读数 5945

在写ConsoleWindow的双击重定向编辑器扩展的时候,出现了这个错误.
这里写图片描述

最终发现原因是,在inspectors刷新之前,双击跳转会报这个错,解决办法就是用Unity的EditorApplication延迟调用.

这里写图片描述

EditorApplication.delayCall = delegate ()
{
  //do something
};
2019-08-22 15:25:22 ethuangfen 阅读数 445

      在写这边博客之前,对光照贴图的动态加载有一点了解,一直没有自己动手去实现,然后网上百度找了一些例子去实现,但是发现好多例子都是你转载我的我转载你的,写得繁琐,没有讲明重点。

    使用光照贴图有什么好处?好处就是避免动态实时的进行光照计算,提高效率。那么如何进行LightMap的动态加载呢?

    首先,你要知道怎么去烘焙场景(自行百度),烘焙好场景后,会生成你的编辑器下生成 如下的几个文件

    其中Lightmap-0_comp_dir.png和Lightmap-0_comp_light.exr就是我们需求用到的文件。

  1. 将Lightmap-0_comp_dir.png和Lightmap-0_comp_light.exr这两个文件打包成Assetbundle。
  2. 将场景中的Capsule,Plane和Sphere添加LightMapData脚本,通过写编辑器个工具记录他们的光照贴图信息,如下图:

然后把这三个物体打包成Assetbundle。

3.把光照贴图动态加载进来,测试代码如下:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Load : MonoBehaviour
{
    private const string serverIP = "http://127.0.0.1:8001/";
    private List<string> ligthList = new List<string> { "lightmap-0_comp_light", "lightmap-0_comp_dir"};
    private List<string> gameObjectList = new List<string> { "capsule", "plane" , "sphere" };
    // Start is called before the first frame update
    private LightmapData lightmapData = new LightmapData();
    private List<LightmapData> lightmapDatas = new List<LightmapData>();
   

    private void OnGUI()
    {
        GUILayout.BeginVertical();
        if (GUILayout.Button("LoadLightMaps"))
        {
            for (int num = 0; num < ligthList.Count; num++)
            {
                StartCoroutine(LoadLightMap(serverIP, ligthList[num]));
            }
        }
        if (GUILayout.Button("SetLightMaps"))
        {
            lightmapDatas.Add(lightmapData);
            LightmapSettings.lightmaps = lightmapDatas.ToArray();
        }
        if (GUILayout.Button("LoadGameObject"))
        {
            for (int num = 0; num < gameObjectList.Count; num++)
            {
                StartCoroutine(LoadGameObject(serverIP, gameObjectList[num]));
            }
        }
        GUILayout.EndVertical();
    }

    IEnumerator LoadGameObject(string  path , string resName)
    {
        string url = string.Format("{0}{1}.unity3d" , path , resName );
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        yield return request.SendWebRequest();
        AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        GameObject go = Instantiate(ab.LoadAsset<GameObject>(resName));
        go.isStatic = true;
        PrefabLightmapData prefabLightmapData = go.GetComponent<PrefabLightmapData>();
        if(prefabLightmapData != null)
        {
            go.GetComponent<Renderer>().lightmapIndex = prefabLightmapData.lightmapIndex;
            go.GetComponent<Renderer>().lightmapScaleOffset = prefabLightmapData.lightmapOffsetScale;
        }
      

    }
    IEnumerator LoadLightMap(string path, string resName)
    {
        string url = string.Format("{0}{1}.unity3d", path, resName);
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        yield return request.SendWebRequest();
        AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        Texture2D texture2D = ab.LoadAsset(resName) as Texture2D;

        if (resName.Contains("dir"))
        {
            lightmapData.lightmapDir = texture2D;
        }
        else
        {
            lightmapData.lightmapColor = texture2D;
        }
    }

}

最后运行结果:

 

主界面玩家信息玩家升级Loading登录

博文 来自: juddhuanglei

U3D脚本不自动编译

阅读数 1239

没有更多推荐了,返回首页