Unity 资源束(Asset Bundle)可视化编辑构建工具

Unity中的内容动态更新一般都使用AssetBundle来实现,相对于Unity4.x的AssetBundle(简称AB)时代,Unity5.x对AB的做了很大改进,创建AB方便了很多,不过里面的文件结构或者冗余还是不太容易.

.

所以Unity官方又开发了一个小工具”Unity Asset Bundle Browser tool”,旨在改变现在AB的工作流,这个工具是编辑器扩展脚本的形式存在的

可以从Github上获取最新的代码:

https://github.com/Unity-Technologies/AssetBundles-Browser

将代码放置于项目的Editor目录下即可使用.注:当前仅支持Unity5.6及更新的版本上使用.

到菜单”Window->AssetBundle Browser”中执行这个工具.

AB中的资源关联,资源尺寸,资源内容,资源共用等信息一目了然.删除添加编辑都可以操作了,很简单易用.

Github页面中也有简要使用说明.

Unity与苹果macOS 10.13 (High Sierra)的问题

现阶段是不建议升级更新到 macOS 10.13 High Sierra的.
但是如果像我一样不清楚带来的问题升级到了10.13,那么需要对应的升级Unity编辑器来修正这个问题,具体现象是编辑器打开任何项目,在Project视图都是空的,什么都没有,Unity编辑器无法读取项目资源文件.
原由苹果对机器的固态硬盘做了分区格式做了改变,之前是HFS文件系统,现在改为了APFS,即Apple File System.导致老版本软件不兼容了,比如旧版本的迅雷(不评价它善恶).
升级后,要解决Unity使用问题,有两种办法:
方案一:更新Unity编辑器,当前Unity有下面一些版本可以正常使用:
– 5.5.4 patch 5 及更新版本
– 5.6.3 patch 4 及更新版本
– 2017.1.1 patch 3 及更新版本
– 2017.2.0 RC 1 及更新版本

可以从https://unity3d.com/unity/qa/patch-releases下载需要的版本,虽然是patch版,但其实和全新安装没什么区别,并不是很小体积的补丁包

更低的版本,如5.4.x就没有补丁版了,可以用第二种办法解决.

方案二:使用移动硬盘或者新建一块分区来放置项目,用Unity打开这个分区上的项目来使用,只要不是APFS类型的分区,都可以正常使用.

相关链接:https://forum.unity.com/threads/unity-and-macos-10-13-high-sierra.474527/

Unity中飘逸的头发或飘带实现

在Unity开发中,有些角色我们要赋予TA更多的细节让衬托真实度,比如女孩的长发飘飘,或者丝带,旗帜,虽然我们可以用动画clip来呈现,也可以用Spring Joint和Configurable Joint来设置创建丝带,绳子之类,但是设置起来我觉得挺麻烦的.

找来找去,在一位日本的Unity开发者博客上找到了一组脚本,实现飘逸的长发或飘带还是挺好用的.

这是Webplayer案例:http://rocketjump.skr.jp/unity-spring-test/

这是测试案例,用了Unity二次元角色:
http://rocketjump.skr.jp/download/SpringTestScene.zip

这是只含必须的脚本包:http://rocketjump.skr.jp/download/SpringScript.zip.

具体用法可参考测试案例中,下面只简要说明可能会遇到的问题,首先要在飘起来的模型中让美术构建骨骼及蒙皮,如要动起来的这部分含有动画,那么可以在fbx导入设置中将这部分动画取消动画的导入,因为我们用脚本来处理,不使用动画.

在要参与飘动的每根骨头中创建一个空的子对象(empty gameobject),并将子对象移动到当前所属骨头的末端,之后再给参与运动的每根骨头挂上Spring Bone脚本,里面的Child指定刚才我们创建的子对象,Bone Axis来描述末端相对与骨骼坐标点的方向,如empty gameobject在骨骼坐标y轴负方向上,那么BoneAxis添”0,-1,0″,Radius只半径,这里用来生成碰撞体,仅支持球形碰撞体,Stiffness Force是硬度,数值大像钢筋,数字小像丝带,DragForce是力衰减,数值大,整个模型动起来约像丝带,数值小整个模型动起来像多节棍.具体可调整各值观察结果.
之后在我们这个模型的父级添加SpringManager脚本,并把所有添加了Spring Bone脚本对象都拖拽到SpringManager数组字段中.播放拖动模型起始骨骼就可以看到效果了.
如我们制作角色头发飘动效果,那么我们还希望头发与角色身体发生碰撞,避免头发穿透角色身体,这就要创建Gameobject并赋予SpringCollider脚本,可以看到绿色球形Gizmo,通过调整它的直径来改变碰撞球的范围,将它放置在想要阻挡头发穿透的地方,并将Spring Bone中指定需要产生碰撞的SpringCollider对象(勾选debug后播放可以看到黄色球型Gizmo).

大概就是这样了,还是要实践出真知.

参考文献:http://rocketjump.skr.jp/unity3d/109/

转载请注明来自1vr.cn By XK

使用AndroidStudio为Unity5.*搭建安卓开发环境

使用Time capsule恢复了系统备份后,发现还是存在一些问题的,比如QQ聊天记录文件错乱,然后又发现了Finder侧边栏有异常,收藏栏会莫名其妙的消失,去Finder偏好设置里勾选项目,仍旧会出现这个问题,似乎配置文件变成了只读.最烦恼的Safari上传文件时打开文件选择窗口时侧边也是没有收藏栏的,瞒麻烦的.
后尝试删除相关配置文件重启后解决了问题,方法如下:
进入~/Library/Preferences目录,找到

com.apple.finder.plist
com.apple.sidebarlists.plist

这两个文件删除并重启系统即可修正这个问题,真是奇怪.
突然又想找Mac上类似之前在Windows上用的很爽的TC(total commander)软件,终于找到一个靠谱的,叫”Commander One”,推荐Mac用户试试这分栏式文件管理器,当然要自定义快捷键才用起来舒服,默认的键设几乎没法用.

之前Unity开发Android的环境都是手工搭建的,装eclipse又装sdk的,发布apk也没有问题就一直没更新环境,前几天才看到早就有androidstudio这么一套工具,闲着没事更新一下吧,当时用的Unity版本为5.5.0,结果怎么都提示找不到sdk:

折腾了许久才找到原因,是因为sdk tools的版本过新,而Unity5.5.0中是不支持v26.0.2版的,只能把sdk tools换成v25版本才可以,我最后用的是25.2.5这个版本.可以从网上单独下载这个版本,然后替换android sdk目录下的tool目录文件.

最后别忘记检查Unity的偏好设置中sdk路径指定是否正确,要指定到sdk的根目录,而不是sdk下面的子目录,也就是说不是tool等目录.

再Build就不会有问题了.

最近在看机械键盘,之前一直觉得机械键盘只为自己爽不顾他人感受,可竟然有点想反正大家都吵了,一起吧,看谁狠的意思.吐槽下新款苹果本子键盘和苹果二代蓝牙键盘,键程短的可以,为了追求薄而忽略了很多本应保留的东西,合适吗?!还好这两个设备目前我都没有买.

Mac中的bogon名字修改

前些天本子送到苹果天才吧修理,不知道被弄了什么法术,导致系统崩溃,回来后用时间胶囊恢复的系统数据,用着用着发现终端里的计算机名是bogon了,这是什么鬼?

于是网上搜了搜,大概是终端会向DNS服务器查询本地IP的什么解析,如果没查到就会显示计算机名,而DNS错误将保留地址反向的NS查询结果返回了bogon,而bogon本该用来标定虚假的IP地址,而非保留IP地址.所以计算机名就成了bogon了.

如果计算机名是bogon,那么只要在系统偏好设置里面打开找到”共享”,在此窗口的上方可以修改”电脑名称”.

如果是终端里显示bogon,像下面这样:

bogon:~ username$

可以直接用下面这个命令修改,将newhostname替换成想改的名字即可:

scutil --set HostName newhostname

执行后建议重启系统后再使用.

AR中的阴影镂空,蒙板处物体遮掩,蒙板处物体显示等

我们在做AR(增强现实)的时候,有几种效果需求会遇到.

1:阴影镂空
通过成功识别Marker(花朵背景),在Marker位置生成立方体模型,为了效果逼真,我们需要立方体模型产生个阴影投影,默认情况下我们只能用其它模型来接受立方体的阴影投射,Marker模型在Play时是不能用于接受立方体阴影的,我们把接受阴影的Plane模型进行处理,让它仅保留投射的阴影部分,其余部分镂空,这样再与相机画面叠加就会产生一个较逼真的阴影效果了.

把下面的shader赋予给接受阴影的模型即可完成阴影透明镂空效果,图中黑色阴影其实是原本的Plane,与Maker无关.

Shader "FX/Matte Shadow" {
 
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
 
SubShader {
 
    Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    LOD 200
    Blend Zero SrcColor
 
CGPROGRAM
 
#pragma surface surf ShadowOnly alphatest:_Cutoff
fixed4 _Color;
struct Input {
    float2 uv_MainTex;
};
inline fixed4 LightingShadowOnly (SurfaceOutput s, fixed3 lightDir, fixed atten)
{
    fixed4 c;
    c.rgb = s.Albedo*atten;
    c.a = s.Alpha;
    return c;
}
 
void surf (Input IN, inout SurfaceOutput o) 
{
    fixed4 c = _Color; 
    o.Albedo = c.rgb;
    o.Alpha = 1;
}
 
ENDCG
}
 
Fallback "Transparent/Cutout/VertexLit"
 
}

2:蒙板处物体遮掩

黄色模型为蒙板,其它模型凡是被蒙挡的地方都不渲染,就像布尔减去黄色模型一样,这个效果可以用来做什么呢?比如说做了人脸识别,要给相机图像中的角色戴副眼镜,如果没有用蒙板遮挡,那么无论相机画面里是侧脸还是正脸都将看到完整的眼镜,这与现实不符,现实中侧脸的时候我们只能看到视距较近的眼镜腿,另一侧眼镜腿应该被脸部遮挡,而我们取的相机画面,它是2D平面的图像,不能自动帮我们进行正确的显隐,所以我们要做一个适当的头部模型作为裁切蒙板即替代黄色模型来把不应显示的部分遮掩掉.

只需将下面的shader作为材质球赋予给希望作为蒙板的模型即可.

Shader "DepthMask" {
   
    SubShader {
        // Render the mask after regular geometry, but before masked geometry and
        // transparent things.
       
        Tags {"Queue" = "Geometry-10" }
       
        // Turn off lighting, because it's expensive and the thing is supposed to be
        // invisible anyway.
       
        Lighting Off

        // Draw into the depth buffer in the usual way.  This is probably the default,
        // but it doesn't hurt to be explicit.

        ZTest LEqual
        ZWrite On

        // Don't draw anything into the RGBA channels. This is an undocumented
        // argument to ColorMask which lets us avoid writing to anything except
        // the depth buffer.

        ColorMask 0

        // Do nothing specific in the pass:

        Pass {}
    }
}

3:蒙板处物体显示

这个蒙板默认情况下会将它所覆盖的所有对象都裁切掉,可谓杀的毫无痕迹,如果我们用Unity内置的相机纹理贴到模型上作为图像背景的时候,它同样也会被蒙板扼杀掉,而我们不喜欢它被挖空,所以要针对它进行处理,让这部分不受蒙板影响.

把下面的脚本挂接到任何不想被蒙板影响的对象上,如我们挂到蓝色模型上,脚本有个暴露的变量,我们将RenderQueue设置比蒙板shader的RenderQueue数值小的值,在Play时,蓝色模型就可以无视蒙板.

using UnityEngine;

[AddComponentMenu("Rendering/SetRenderQueue")]

public class SetRenderQueue : MonoBehaviour {

	[SerializeField]
	protected int[] m_queues = new int[]{3000};

	protected void Awake() {
		Material[] materials=this.GetComponent().materials;
		for (int i = 0; i < materials.Length && i < m_queues.Length; ++i) {
			materials[i].renderQueue = m_queues[i];
		}
	}
}

资料参考:
http://mec0825.net/blog/?p=126
http://wiki.unity3d.com/index.php?title=DepthMask

NGUI解决鼠标穿透问题即判断当前是否在控制UI

在开发中,时常会遇到界面和叠加界面上其它对象操作冲突的问题,举个简单例子做一个地球仪,用鼠标控制地球仪旋转,同时在屏幕上又用了ScrollView视图当用鼠标去拖拽ScrollView视图中的内容时,地球仪也随着旋转了,我们需要解决这个问题.

一般来讲,如果界面固定(在屏幕下部等),省事的做法就是把菜单区和地球仪控制区进行划分,使用 Rect.Contains(Input.mousePosition) 进行鼠标位置的判断,在地球仪控制区就控制地球旋转,在菜单区就响应菜单暂时禁用地球旋转控制.

而界面相对复杂或者位置动态变化等,上面的方法用清楚就比较麻烦了,好在现在的NGUI版本提供了一个方法,可以非常渐变的判断鼠标或手指是否在界面上,如果是即返回true.

UICamera.isOverUI

直接用在要进行判断的代码处就好,比如在地球旋转控制条件中加上”&& !UICamera.isOverUI”,如果鼠标或手指在UI之上时,就不执行控制地球旋转的代码,要注意的是UI组件上要含有碰撞器才会被检测到.不建议放在Update中不停的监测状态,这会相对增加资源消耗,在满足一定条件下再去判断是否介于UI之上比较好,如Input.GetMouseButton(0)时再”UICamera.isOverUI”后进行执行与否的代码.

CentOS下用crontab设置自动重启MySQL计划(2)

之前写了一篇在每天凌晨2:30重启一次MySQL的文章:http://1vr.cn/?p=1818,用了一段时间感觉没什么异常,但今天又出现了数据库非正常关闭,真是头疼,看了下日志(终端输入:tail -f /var/log/mysqld.log),时间还在在2:30之前,不知道什么异常导致,看来有时间还是要彻底查查原因.

170703  0:41:54  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 0 22991466
170703  0:41:54  InnoDB: Started; log sequence number 0 22991466
170703  0:41:54 [Note] Event Scheduler: Loaded 0 events
170703  0:41:54 [Note] /usr/libexec/mysqld: ready for connections.

在彻底查到原因之前先打个速效针吧,找了一段bash shell脚本,判断mysql服务的状态,如果没有运行,则重启mysql.

脚本放哪无所谓,能找到就行,用”vim /etc/checkmysql.sh”创建个新文件,名为checkmysql.sh,放在了etc目录下.

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo "Time: `date` :MySQL is over .">> /var/log/mysql_messages
service mysqld start
else
echo "MySQL server is running."
fi

输入”:wq”保存并退出文件,测试一下文件效果,使用”./checkmysql.sh”或绝对路径”/etc/checkmysql.sh”,可以当前Mysql状态,如已停止,那么尝试启动它.如果脚本文件权限不对,改它权限为655,命令是”chmod -R 655 checkmysql.sh”.

接下来我们需要定时的执行这个脚本,让它帮助我们监测mysql状态.还是用到了crontab,之前的文章里有比较详细的用法,这里简单说明,我要做的是让脚本3分钟执行一次,那么打开crontab编辑(命令:vim /etc/crontab):

井号注释掉之前的每天2:30重启任务,添加下面这样

*/3 * * * * root /etc/checkmysql.sh

“*/3″代表每间隔三分钟执行一次,如果你要五分钟执行一次,那就是”*/5″喽.

保存后重启crontab即可(命令:service crond restart),如果你要测试效果,可以service mysqld stop,几分钟后看mysql是否自启.

原创文章,转账请注明来自 http://1vr.cn,By XK.