C#, dotNet

在学校时常用,做asp.net或客户端程序

Unity中将Animation Clip嵌入Animator Controller的方法

最近再研究Unity的UI动效果,过程中发现一个小细节:在使用UGUI的Button时,如果设置Transition过渡方式为Animation动画,并通过Auto Generate Animation自动生成Animator Controller及四个按钮状态对应的Animation时,会发现生成的Asset资源是这样

和其他FBX动画等一样,动画Animation Clip是直接嵌入Controller的,而当实现一些如UI弹出动画之类的效果时,也使用Animator,自己手动创建Controller后,却没有可视化的直接在创建内嵌Clip以及State的方法,只能创建State然后关联Clip,或者先创建Clip,再拖入Controller自动生成关联State,最后Asset里会是这样:

看着明显不如Button自动生成的那种要整洁!
继续阅读…

回避由于Unity3D编辑器播放时编译脚本重加载程序集导致报错卡死等问题

Unity3D有一个叫做”live recompile”的功能,即在编辑器处于播放状态时修改脚本代码或替换托管dll等操作时,当场触发重新编译生成项目脚本assembly,并会进行重新加载操作,然而,这个功能很多时候并不能保证重加载后的代码逻辑依然能正常运行,轻则报错,重则卡死。经过博主测试发现,Unity在重加载assembly后,会清空类实例部分成员变量的值(如在Awake中new出的数组对象等),且不负责还原。最终,为了避免由于此导致的问题,采取了一种回避的手段:通过Editor脚本方式检测是否在播放状态时触发了脚本编译,是的话立即停止播放,代码如下:
继续阅读…

Unity3D游戏实现微信分享截图功能

Unity3D本身内置了一个截屏并保存为图片的功能:

public static void CaptureScreenshot(string filename, int superSize = 0);

然而,在配合微信做截屏分享的时候,发现这个简单的静态函数并不能顺利实现功能逻辑,关键原因在于这个函数的实现是异步的,也就是说,你想要的截图并不会在这个函数调用后立即生成!尤其是在移动平台上,这个函数的延迟可能更大,而且更悲剧的是:这个函数并没有让调用方知道截图生成ok了的机制,比如回调等,所以,在参考了网上的资料后,还是自己实现了一个截图保存的方法: 继续阅读…

64位Unity集成亲加(gotye)即时通讯SDK时的editor动态库设置DllNotFoundException

最近在测试亲加的语音聊天SDK(版本:gotyeapi_ex_v3.0_20170121_u3d.zip),由于直接提供了Unity版本的插件实现,简化了用Unity引擎开发的App集成时的难度,尤其还提供了Windows平台的实现,可在Editor环境下直接测试大部分功能,这是大部分平台相关SDK所不具备的!在实际测试中,发现了一些官方文档中没有说明的小问题,特记录于此。
首先,下载的zip并没有像官方文档中描述的一样,只有一个unitypackage,这点影响不大,直接解开zip中的内容,复制所有cs文件到项目中即可,后面根据官方文档上的指引,windows平台需要将对应32位或64位版本的Plugins中的dll复制到Unity安装路径的Editor下,也就是Unity编辑器执行文件所在的位置。这点要注意并不是常规的项目中的Plugins路径!操作完成后,项目中加入初始化代码,然后运行,出现了官方文档中提到的“win64下的U3D的DLL找不到”的问题:

DllNotFoundException: gotyeapi
gotye.GotyeAPI..ctor () (at Assets/gotye/GotyeAPI.cs:52)
(wrapper remoting-invoke-with-check) gotye.GotyeAPI:.ctor ()
gotye.GotyeAPI.GetInstance () (at Assets/gotye/GotyeAPI.cs:122)

继续阅读…

IAsyncOperation does not contain a definition for GetAwaiter…

最近研究MS的UWP,发现虽然平台统一了,但是.net的API却变化很大,很多以前的常用的系统库函数、类都被砍掉了,比如读写文件的System.IO.FileStream,UWP下要改用StorageFile,结合异步操作async, await倒还算方便,但看完文档后一试:

StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(SAVE_FILE, CreationCollisionOption.ReplaceExisting);

就报了错:

error CS4036: ‘IAsyncOperation‘ does not contain a definition for ‘GetAwaiter’ and no extension method ‘GetAwaiter’ accepting a first argument of type ‘IAsyncOperation‘ could be found (are you missing a using directive for ‘System’?)

虽然看提示也发现了原来是缺少”using System;”,究其原因,原来是这样:
await关键字的出现会触发编译器调用WindowsRuntimeSystemExtensions.GetAwaiter,是CreateFileAsync返回的泛型类IAsyncOperation的扩展方法(从而获得TaskAwaiter来进行await),而WindowsRuntimeSystemExtensions是存在于System命名空间下的,所以对System的using是必不可少的。

Unity3D导入TTF生成文字图集的跨平台不确定性问题

Unity3D中,TTF字体可以以动态或静态方式使用,其中静态方式可以通过指定某些字符(某个字符集或者自定义的一些字符)生成文字图集材质及贴图,类似下图这样:
QQ截图20160815092800
而这次要说的问题就出在这个文字图集的贴图上,具体情况是在TTF设置同样的Font Size,Rendering Mode,Character和Custom Chars(使用Custom set字符集模式)的情况下,Unity Editor在不同系统下(Windows和Mac OSX)生成的贴图不一致的问题:
ttf1
可以看到,同一个“格”字生成了不同的字模(朝向、位置都有些许变化)。这个问题,如果是文字图直接拿来用的话还好,但要做一些手脚的话,比如手动修改贴图,实现一些如渐变,描边等艺术字效果的话就会引起麻烦,图集信息不同,要不就得改两次贴图,要不就会显示错乱。
继续阅读…

Unity3D使用MonoDevelop进行开发时的项目编译问题

自从VS2015出现以后,Unity3D的新版本也直接内置了对其支持,写代码和调试都非常方便,但是在没有VS2015的开发环境下,比如没装或者是装不了(Mac OSX)下,用Unity自带的MonoDevelop也还算方便。
这次记录的是一个之前太注意的小问题,C#脚本中写了个带默认参数的函数,结果发现Unity编辑器可以编译运行,但在MonoDevelop调试时却提示编译错误,检查了下,发现原来是默认用MonoDevelop调试时,这个IDE也会对打开的项目进行编译,但其编译的方式和Unity本身不太一样,对这些后加入支持的代码写法并不支持,解决方法也很简单:Tools->Options->Unity->Debugger->Build project in MonoDevelop,这个选项勾掉就可以了。

[ZT]如何把string解析为int?

Q:如何把string解析为int?
A:简单的方法有三种:
string source = “1412”;
int result = 0;
// 使用Convert.ToInt32(string value);
result = Convert.ToInt32(source);
// 使用Int32.Parse(string value);
result = Int32.Parse(source);
// 使用Int32.TryParse(string s, out int result);
Int32.TryParse(source, out result);

继续阅读…

还是那个P/Invoke,发现了一个小问题

上次那个P/Invoke调用WinAPI的是用Borland Delphi和Cassini服务器,本来以为没问题的,结果最近换到了IIS上,FindWindow就找不到窗口了,经过研究,发现问题出在IIS是作为系统服务运行这上面。
Cassini是以administrator运行的一个程序,而IIS不是,所以找不到窗口。
解决的办法是把IIS的服务设成“允许与桌面交互”,但是这样对安全性不好。
CodeProject上的一个解决方法是自己写一个服务,把那个允许交互打开,而API调用他用了System.Runtime.Remoting,具体还没有完全理解,感觉M$挺神奇的。

继续阅读…