1.使用过程
1.1 分解合体
点击风扇引擎位置,如图1-1。再次点击风扇引擎位置,风扇可以进行合体,效果如图1-2
1.2 风扇旋转
点击风扇扇翼位置,风扇可以进行旋转,如图2-1,再次点击风扇扇翼位置风扇停止旋转
1.3 手势移动缩放旋转
在App中用手指对如图3-1位置进行操作,可以使物体移动缩放旋转,一根手指长按拖动,可以让物体跟随手指移动,两根手指拉近离远可以对物体进行缩放,两根手指同时进行平移可以对物体进行旋转
1.4 代码
首先要给物体赋予两个代码,如图2-1,其中Lua Runner中添加一个控制器,用来管理Assets Ref中的Lua脚本,使得我们可以在Assets Ref中添加多个脚本来对同一个物体进行操作,多个脚本放在Assets Ref中的List列表里
控制器代码
local function Control(gameObject)
local assets = gameObject:GetComponent('AssetsRef')local data_WeilyControl = assets:At(0)local script_WeilyControl = DarAR.CreateLuaClass(gameObject, data_WeilyControl.text)
end
return Control
由于我的当前物体只有一个Lua脚本,所以只需要在Assets Ref的List列表里面添加一个Lua脚本即可。
要使物体可以同时进行移动缩放旋转,就要给物体本身添加三个组件,分别控制移动,缩放,旋转
_c.transform.gameObject:AddComponent(“MoveControl”);
_c.transform.gameObject:AddComponent(“RotateControl”);
_c.transform.gameObject:AddComponent(“ZoomControl”);
要使物体可以进行动画播放,首先要得到物体身上的Animator,一共有两个Animator,分别为分解合体和旋转,并且把旋转的动画的播放速度设置为0
body=_c.transform:FindChild(“GameObject”).gameObject
BodyAnim=body:GetComponent(UnityEngine.Animator);
yezi=_c.transform:FindChild(“GameObject/blades”).gameObject
YeziAnim=yezi:GetComponent(UnityEngine.Animator);
YeziAnim.speed=0;
利用射线检测检测鼠标点击位置
if UnityEngine.Input.GetMouseButtonDown(0) then
local ray = UnityEngine.Camera.main:ScreenPointToRay(UnityEngine.Input.mousePosition)
local ok, hit = UnityEngine.Physics.Raycast(ray, Slua.out)
因为物体上的BoxCollider只有3个,一个用来触发分解合体动画,一个用来触发风扇旋转,一个用来触发移动缩放旋转事件,所以只需要点击这三个BoxCollider,如果点击到其他地方就不进行任何操作
if hit.collider.gameObject ~=nil then
if hit.transform.name==”blades” then
要事先声明一个布尔变量,用来判断风扇是否旋转或者风扇本身分解还是合体,在if……else……里对布尔变量进行判断(如果变量为true的话,就让风扇进行旋转,并且把变量设置为false,如果变量为false的话,就让风扇停止旋转,并且把变量设置为true)
if(isZhuan) then
YeziAnim.speed=1;
isZhuan=false;
—print(YeziAnim.speed);
else
YeziAnim.speed=0;
isZhuan=true;
—print(YeziAnim.speed);
end
end
if hit.transform.name==”GameObject” then
(如果变量为true的话,就让风扇进行分解动画,并且把动画变量设置为false,如果变量为false的话,就让风扇进行合体动画,并且把变量设置为true)
if(isFenjie) then
BodyAnim:Play(“fenjie”,0,0);
isFenjie=false;
else
BodyAnim:Play(“heti”,0,0)
isFenjie=true;
end
End
完整代码如下
if not GameObject then
import ‘UnityEngine’
end
fengshan = { }
setmetatable(fengshan, ARBase)
local _c = nil;
function fengshan:new(c)
_c = c;
local o = ARBase.new(self, c)
return o
end
local body;
local yezi;
local isFenjie=true;
local isZhuan=true;
function fengshan:Start()
—GameObjectEX.SetLayer((gameObject,20));
_c.transform.gameObject:AddComponent(“MoveControl”);
_c.transform.gameObject:AddComponent(“RotateControl”);
_c.transform.gameObject:AddComponent(“ZoomControl”);
body=_c.transform:FindChild(“GameObject”).gameObject
BodyAnim=body:GetComponent(UnityEngine.Animator);
—BodyAnim.speed=0;
yezi=_c.transform:FindChild(“GameObject/blades”).gameObject
YeziAnim=yezi:GetComponent(UnityEngine.Animator);
YeziAnim.speed=0;
end
function fengshan:Update()
if UnityEngine.Input.GetMouseButtonDown(0) then
local ray = UnityEngine.Camera.main:ScreenPointToRay(UnityEngine.Input.mousePosition)
local ok, hit = UnityEngine.Physics.Raycast(ray, Slua.out)
if ok then
if hit.collider.gameObject ~=nil then
if hit.transform.name==”blades” then
if(isZhuan) then
YeziAnim.speed=1;
isZhuan=false;
—print(YeziAnim.speed);
else
YeziAnim.speed=0;
isZhuan=true;
—print(YeziAnim.speed);
end
end
if hit.transform.name==”GameObject” then
if(isFenjie) then
BodyAnim:Play(“fenjie”,0,0);
isFenjie=false;
else
BodyAnim:Play(“heti”,0,0)
isFenjie=true;
end
end
end
end
end
end
return “fengshan”
2 如何导出Assetbundle包
首先要保证你的工程项目文件下有一个Assetbundle文件夹,如果没有的话可以新建一个Assetbundle文件夹。如图3-1
保证Assetbundle文件夹里没有任何文件,如果有的话使用Unity工具栏下WSTool里的清空Assetbundle,清空工程文件夹下Assetbundle里的已有Assetbundle包,也可以自己进入工程项目文件下手动删除,如图3-2
清空Assetbundle文件夹下的文件后,在Unity里的Project面板中选中你要导出Assetbundle包的Prefab文件,如图3-3,选中后在Unity工具栏下的UnityExport中的SelectPrefab,点击Build就可以对当前选中Prefab进行导出Assetbundle包,默认路径为工程文件夹下的Assetbundle文件夹,如图3-4

