关于脚本在代码中对游戏对象的声明类型:(这个涉及到有些情况下能不能访问的问题)
public类型的才可以在脚本挂载的对象的Inspector属性查看器中显示;private类型以及protected类型则不能在Inspector属性查看器中显示
public类型的变量和方法可以在其他所有类中使用;private类型的变量和方法只能在自身类中使用;protected类型的可以在子类和相同的命名空间中进行使用;不写类型的变量和方法只能在同一个明明空间中使用
比如我在Grid对象上挂的脚本,在里面为public类型的变量都可在属性查看器中看到:
public GameObject bus;
public Texture[] textures;
1.通过Inspector属性查看器来指定参数
这种只适合在脚本代码中声明为public类型的变量,可以在Inspector属性查看器的脚本组件下面显示,并将对应的赋值直接拖进去即可实现赋值。
eg:(挂载的游戏对象上面有一个Hello脚本)
using UnityEngine;
using System.Collections;
public class Test:MonoBehaviour{
public GameObject gameObject;
void Update()
{
Hello hello = gameObject.GetComponent<Hello>();
//下面就可以对hello进行操作调用方法和变量
}
}
这个脚本写好之后,可以直接将想要访问的游戏对象拖拽到Inspector属性查看器的相关参数然后就进行了赋值
2.确定层次关系,通过父子关系来找到游戏对象
在Hierarchy面板的场景中的对象列表中存在父子关系,带小箭头的为父,内为子
eg:
using UnityEngine;
using System.Collections;
public class Test:MonoBehaviour{
void Update()
{
//找到当前游戏对象的名字为name的子对象,并执行function()
this.transform.Find("name").function();
//找到父对象,并执行function()
this.transform.parent.function();
}
}
当这样找到对象之后,直接将this.transform.Find("name")和this.transform.parent看成是一个游戏对象,后面就可以像直接处理对象一样找到对象相应的组件
eg:
Hello hello=this.transform.Find("name").GetComponent<Hello>();
3.通过名字或者标签来获取游戏对象
FindWithTag和Find,FindWithTag是获取指定标签的游戏对象,Find是获取指定名字的游戏对象
Tips:如果对象的标签比较多,可以建一个Tags类,专门将所有的标签都存储进去,这样使用标签的时候可以直接通过Tags来进行调用。
eg:
using UnityEngine;
using System.Collections;
public class Test:MonoBehaviour{
void Awake()
{
// 获取指定名字的游戏对象
Gameobject g1 = Gameobject .Find("name");
// 获取指定标签的游戏对象
Gameobject g2= Gameobject .FindWithTag("tagName");
}
}
4.通过传递参数来获取游戏对象
一些时间的回调方法的参数中包含了特殊的游戏对象或者组件信息,例如出发碰撞事件的Collider组件,在OnTriggerStay方法的参数中有个碰撞参数,通过这个参数可以得到碰撞的刚体组件或者其他组件。
eg:
using UnityEngine;
using System.Collections;
public class Test:MonoBehaviour{
void OnTriggerStay(Collider col)
{
if(col.GetComponent<Rigidbody>())//如果该游戏对象有刚体
{
//让该刚体执行function()
col.GetComponent<Rigidbody>().function();
}
}
}
5.通过组件名称获取游戏对象
FindObjectsOfType<>()和FindObjectOfType<>()
FindObjectsOfType <>()是获取所有挂载指定类型组件的游戏对象;FindObjectOfType<> ()是获取挂载指定类型组件的第一个游戏对象
eg:
using UnityEngine;
using System.Collections;
public class Test:MonoBehaviour{
void Awake()
{
//获取挂载指定类型组件的第一个游戏对象
Hello hello = FindObjectOfType<Hello>();
Debug.Log(hello.gameObject.name);
//获取所有挂载指定类型组件的游戏对象
Hello[] hellos = FindObjectsOfType<Hello>();
foreach(Hello h in hellos)
{
Debug.Log(hello.gameObject.name);
}
}
}