什么方法可以找到场景下所有的unity gameobject数组

unity3D技术之导出Unity场景的所有游戏对象信息_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
unity3D技术之导出Unity场景的所有游戏对象信息
上传于||文档简介
&&unity3D技术
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢分享是一种态度 一句中肯的评价可能改变一个行业 一次用心的分享可能改变他人的一生
你的态度和观点将让我们的行业更强大实例亲授:教你如何创建AR应用
发表于 11:32|
摘要:本文作者是一位刚刚接触AR开发的年轻开发者,他将教你利用现有的人物模型,在Unity中创建虚拟按钮,形成现实世界与虚拟世界的交互。
我们曾经介绍过许多AR应用中的
,他们利用Vuforia与现实进行交互,创造出更加新奇的体验。本文作者是一位刚刚接触AR开发的年轻开发者,他将教你如何在现实世界和虚拟世界中加入虚拟按钮,形成交互。
译文如下:
在这个教程中,我们会再我的
关于虚拟现实(augmented)的教程基础上再增加一些很酷的玩意。对我来说:增强现实(AR)本身已经非常棒了,但是这次,我们会在现实世界和虚拟世界中加更多的交互。我们通过添加虚拟按钮来实现这个功能,也就是说只需要简单的在AR世界中添加一个按钮,我们就能在真实世界中点击他。这真真是酷毙了!
图:最终效果
因为我们是基于上一篇教程,所以我们会使用同样的技术Vuforia。这个技术让我们能够简单的达到这个效果。我们这就开始吧!
这里有一段
(youtube视频)我们通过这片教程可以创造的效果。不得不说:这简直太酷了。虽然我必须承认,并不是所有的情况下都能像这样工作良好,不过对于简单的按钮,看起来工作的不错。让我们来看看怎样创建一个像这样的程序。
为了能让你的应用程序像这样工作,你需要具备下面几项条件:
任意一个可以运行的AR应用程序,比如示例程序
C#的基本支持,这个是Unity使用的语言,我们将用他来实现我们的虚拟按钮
另一个用于render(呈现)的3D模型,这样我们才能在几个不同的模型间切换,我会使用
当你一切准备就绪,就让我们进行接下来的步骤。
就像前一个教程讲的那样,你可以这样导入你的模型:
右键单击Project(项目Tab页)中的Assets文件夹
选择“Reveal in
Finder”(在Window上也有可能是“Reveal in Explorer”)
打开Assets文件夹
创建一个名叫Models新的文件夹(或者可以取别的合乎逻辑的名字)
把模型(包括所有的纹理(Texture)等等)放入到这个文件夹中
Unity会检测到你对Assets文件夹所做的改动,并会使用最新的信息更新自己的显示。现在把你的模型拖入到增强显示场景中,放在前一个模型的上面。确保他在层次结构(Hierarchy)中被的放置在正确的ImageTarget下面。我也拷贝了上一个模型一样的Transform属性,所以他们的大小应该相同(只是旋转角度不同),最终你会得到类似下面的效果。
现在看起来稍微有点怪,不用担心,使用我们的虚拟按钮,我们能够确保显示和隐藏正确的模型,让他们互相不会重叠。
现在花时间看一眼model的名称,待会可能会用到他们。在分级窗口(Hierarchy)里可以找到他们,在我的项目里他们分别是:jin1u和yosi1u
添加虚拟按钮
现在我们需要在场景中加入虚拟按钮,在你的Project窗口中,打开Assets/Qualcomm Augmented Reality/Prefabs-folder.这里面能看到VirtualB把他拖动到你的场景中,在Hierarchy(分级窗口)里位于你的ImageTarget之下。本质上讲,当我们查看ImageTarget的时候,虚拟按钮不能被看到,也就是处于不可见(invisible)状态。在Unity中透明物体的默认颜色是蓝色,所以当你在场景中添加虚拟按钮时,也应该同样是蓝色的。
虚拟按钮的形状默认是矩形的,你可以将他变形(Transform)到你的点击区需要的样子和位置。只用确定按钮区域足够覆盖ImageTarget上的一些特征区域;如果探测到这些特征区域被挡住,Vuforia就会认为按钮被点击。下面是我的代码效果。
编写按钮脚本
按钮现在还什么也不能做,我们需要为他添加响应代码。这就需要为他创建一段脚本:
右键单击Project中Assets文件夹
选择“Reveal in
Finder”(在Windows中也可能是“Reveal in Explore”)
打开Assets文件夹
创建一个叫做script的文件夹(或者其他合理的名字)
在文件夹中,创建一个新的空文件,叫做TekkenVirtualButtonEventHandler.cs(或者其他什么你觉得合适的名称),代码的框架如下:
using UnityE
public class TekkenVirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler
/// &summary&
/// Called when the scene is loaded
/// &/summary&
void Start() { }
/// &summary&
/// Called when the virtual button has just been pressed:
/// &/summary&
public void OnButtonPressed(VirtualButtonAbstractBehaviour vb) { }
/// &summary&
/// Called when the virtual button has just been released:
/// &/summary&
public void OnButtonReleased(VirtualButtonAbstractBehaviour vb) { }
}该类中最重要的就是IVirtualButtonEventHandler接口,这个接口保证类实现OnButtonPressed 和 OnButtonReleased两个方法。在这个教程里,我们不会实现OnButtonRelease方法,因为我们暂时用不到他,不过因为接口的原因,类里面必须要有这个方法。这个脚本待会就回附加到ImageTarget上。
首先,我们需要把Button注册为一个活动事件,我们会把下面的代码放到Start方法里(代码里加了注释)
// Search for all Children from this ImageTarget with type VirtualButtonBehaviour
VirtualButtonBehaviour[] vbs = GetComponentsInChildren&VirtualButtonBehaviour&();
for (int i = 0; i & vbs.L ++i) {
// Register with the virtual buttons TrackableBehaviour
vbs[i].RegisterEventHandler(this);
接下来要做的,就是在场景中找到和存储模型(代码中的GameObject)。第一步我们要为类创建两个私有字段
private GameObject _modelJ
private GameObject _modelY
接着在Start方法里对这两个变量进行赋值,在Unity中你可以用Hieraychy下Model的名字来找到gameObject;
_modelJin = transform.FindChild("jin1u").gameO
_modelYoshimitsu = transform.FindChild("yosi1u").gameO在程序开始的时候,我们希望Jin不显示,所以要先把他藏起来。这就是开始方法的最后一行需要做的事情:
_modelJin.SetActive(false);
现在我们开始搞定OnButtonPressed方法!可以看出这个方法的第一个也是唯一一个参数就是被点击的按钮。利用这个参数,可以显示和隐藏模型,这里我们要用到开始设定的按钮名称,实现如下
switch(vb.VirtualButtonName) {
case "btnYoshimitsu":
_modelJin.SetActive(false);
_modelYoshimitsu.SetActive(true);
case "btnJin":
_modelJin.SetActive(true);
_modelYoshimitsu.SetActive(false);
throw new UnityException("Button not supported: " + vb.VirtualButtonName);
也许你想整理一下我的代码,没有关系,我只希望你能理解我的思路。记得保存你的代码。这个类的完整实现可以
附加脚本到ImageTarget
现在回到Unity,程序会自动找到你创建的script文件夹以及你创建的TekkenVirtualButtonEventHandler 。只需把脚本拖拽到Hierarchy里的ImageTarget上方,关联就会自动建立,你能通过选择Inspector中的ImageTarget来验证关联是否正确;如果关联正确建立,就能够看到按钮事件处理器被附加在了按钮上。
这个方法太有用了吧!现在编译你的解决方案,并在你的移动设备上运行(如何运行参考我的上一篇教程)。现在你应该准备好了吧,祝你好运!
截止目前为止,我们已经为虚拟按钮准备好了可以工作的点击区,由于他们不可见,你也许想要加入下面的东西:
把你的ImageTarget换成已打印按钮(这样就能在真实世界里看见他)或者在VirtualButton上添加多个Pane(这样就能在增强现实世界里看到他)
我使用第二个方法,所以我不需要再次打印ImageTarget,但是这样做不好的一面是,你的手在AR世界显示在按钮的下面,除此之外一切正常。
关于ImageTarget更多高级的例子,我推荐阅读《》。
他在如何在运行时创建和删除虚拟按钮给出更多的细节,以及如何把按钮和其他的游戏对象(game object)相连。
大家觉得怎么样?在我看来,一旦你熟悉了相关操作,使用Vuforia向增强现实(Augmented Reality)中添加虚拟按钮就变得非常简单。最终的成果也很有趣!当然你肯定知道,除了简单的显示和隐藏模型,你也可以让他们动起来,旋转,变化纹理。
那么下一步你会做什么?
原文地址:
了解更多AR技术信息,欢迎访问
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章寻找“权力的游戏”真实场景(多图慎入)
一凡不烦 - 文
《权力的游戏》这部美剧制作相当的精良,每一集制作完全可以媲美电影制作,而它的热度已经烧了五季,第六季据说会在16年4月推出。电视剧的拍摄地点现在也变成了热门的旅游景点,不少人前往体验剧中的场景。我们今天看到的图片对电视剧中的场景进行了对比,部分不同之处,当然是后期制作的效果,场景主要集中在克罗地亚,也是第五季的拍摄地。
阅读下一篇
(C) 2007- All Rights Reserved遍历父物体下所有子物体的几种方式
1、通过标签来寻找
void ForeachObjs()
//GameObject objs[] = GameObject
objs = GameObject.FindGameObjectsWithTag(&Cube_00&);
foreach (GameObject obj in objs)
obj.AddComponent(&OnTiggerEnterSendMessage&);
}2、通过Transform来寻找并附加脚本
&foreach (Transform child in gameObject.transform)
child.gameObject.AddComponent(&OnTiggerEnterSendMessage&);
}3、另外一种方式(转)
//把这个函数放到你的代码中 check代表你要查询的物体 name为名称 如return GetTransform(transform,&bone12&);
Transform GetTransform(Transform check,string name)
foreach (Transform t in check.GetComponentsInChildren&Transform&())
if(t.name==name){}
GetTransform(t,name);
}4、(转)
很多高级游戏代码不仅仅控制单一物体。Unity脚本接口有很多方法获得和访问其他游戏物体和组件。下面我们假设有一个名为OtherScript.js的脚本附属于场景中的游戏物体。
var foo = 5;
function DoSomething ( param : String) {
print(param + & with foo: & + foo);
}
1.使用检视视图指定参数。
你能通过检视视图为一些游戏类型指定变量:
// Translate the object dragged on the target slot
var target : T
function Update () {
target.Translate(0, 1, 0);
}
也能显示参数在其他物体检视视图。下面你能在Inspector面板中拖拽包含OtherScript的游戏物体到target上。
// Set foo DoSomething on the target variable assigned in the inspector.
var target : OtherS
function Update () {
// Set foo variable of the target object
target.foo = 2;
// Call do something on the target
target.DoSomething(&Hello&);
}
2.通过继承结构
你能通过Transform组件获得一个子和父物体到现在的物体。
// Find the child &Hand& of the game object
// we attached the script to
transform.Find(&Hand&).Translate(0, 1, 0);
你只要在hierarchy面板建立了transform,你就能用GetComponent去获取other scripts。
// Find the child named &Hand&.
// On the OtherScript attached to it, set foo to 2.
transform.Find(&Hand&).GetComponent(OtherScript).foo = 2;
// Find the child named &Hand&.
// Call DoSomething on the OtherScript attached to it.
transform.Find(&Hand&).GetComponent(OtherScript).DoSomething(&Hello&);
// Find the child named &Hand&.
// Then apply a force to the rigidbody attached to the hand.
transform.Find(&Hand&).rigidbody.AddForce(0, 10, 0);
你可以循环到它所有的子物体。
// Moves all transform children 10 units upwards!
for (var child : Transform in transform) {
child.Translate(0, 1, 0);
}
查看文档Transform类 可以获得更多信息。
3.通过名字或标签
你能用确定的标签搜索物体,使用GameObject.FindWithTag 和GameObject.FindGameObjectsWithTag。使用GameObject.Find通过名字获得游戏物体。
function Start ()
{
// By name
var go = GameObject.Find(&SomeGuy&);
go.transform.Translate(0, 1, 0);
// By tag
var player = GameObject.FindWithTag(&Player&);
player.transform.Translate(0, 1, 0);
}
你能使用GetComponent获得脚本或组件在找到的游戏物体上。
function Start ()
{
// By name
var go = GameObject.Find(&SomeGuy&);
go.GetComponent(OtherScript).DoSomething();
// By tag
var player = GameObject.FindWithTag(&Player&);
player.GetComponent(OtherScript).DoSomething();
}
一些特殊对象如主摄像机有快捷方式,可以使用Camera.main。
4.传递参数
一些事件中包含详细的事件。例如:扳机事件传递(碰撞)Collider组件到碰撞物体的handler函数。
OnTriggerStay给我们一个碰撞参数.从碰撞体我们能给他赋一个刚体。
function OnTriggerStay( other : Collider ) {
// If the other collider also has a rigidbody
// apply a force to it!
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
}
}
或者我们可以获取游戏中碰撞者包含的任意组件。
function OnTriggerStay( other : Collider ) {
// If the other collider has a OtherScript attached
// call DoSomething on it.
// Most of the time colliders won't have this script attached,
// so we need to check first to avoid null reference exceptions.
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
}
}
注意上面的例子,使用其他变量上的后缀,你能获取一些碰撞物体里的组件。
5.某个类型的所有脚本
从一个类找到任意对象或脚本,用Object.FindObjectsOfType或获得某个类型的第一个物体使用Object.FindObjectOfType.
function Start ()
{
// Find the OtherScript which is attached to any game object in the scene.
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5、自己写的深度优先遍历,找物体的孩子并做些什么事情
using UnityE
using System.C
using UnityE
public class ChangeMeshRenderQuality : Editor
[MenuItem(&GameObject/ChangeMeshRenderQuality&)]
static void FindChildMeshRender()
Debug.LogWarning(&Change Now!!!&);
Transform[] selection =
Selection.GetTransforms( SelectionMode.TopLevel | SelectionMode.Editable);
foreach(Transform t in selection)
ChangeQuality(t);
static void ChangeQuality(Transform T)
for(int i = 0 ; i & T.childC i ++)
Transform childTransform = T.GetChild(i);
if(childTransform.GetComponent&SkinnedMeshRenderer&() != null)
childTransform.GetComponent&SkinnedMeshRenderer&().quality = SkinQuality.Bone4;
ChangeQuality(childTransform);
// Disable the menu if there is nothing selected
// 如果什么都没有选择将禁用菜单功能
[MenuItem (&GameObject/ChangeMeshRenderQuality&, true)]
static bool ValidateSelection()
return Selection.activeGameObject !=
共1条评分,
常用的功能。
要评论请先&或者&
常用的功能。
感谢分享!这些代码段够实用!
:常用的功能。 谢谢鹰大的关注~~~
不错的总结,顶起
其实可以考虑用插件来传值
Mark &学习
感谢分享,正在做个多级菜单不知道有什么好方法= =

我要回帖

更多关于 unity复制gameobject 的文章

 

随机推荐