GameObject
继承于 UntiyEngine.Object
Variables | 变量 |
---|---|
isStatic | 只有在API指定一个游戏物体是静态的时候编辑。 |
transform | 附属于这个游戏物体上的变换。(如果没有则为空) |
rigidbody | 附属于这个游戏物体上的刚体(只读)。(如果没有则为空) |
camera | 附属于这个游戏物体上的相机(只读)。(如果没有则为空) |
light | 附属于这个游戏物体上的光(只读)。(如果没有则为空) |
animation | 附属于这个游戏物体上的动画(只读)。(如果没有则为空) |
constantForce | 附属于这个游戏物体上的恒定的力(只读)。(如果没有则为空) |
renderer | 附属于这个游戏物体上的渲染器(只读)。(如果没有则为空) |
audio | 附属于这个游戏物体上的音频资源(只读)。(如果没有则为空) |
guiText | 附属于这个游戏物体上的GUI文本(只读)。(如果没有则为空) |
networkView | 附属于这个游戏物体上的网络视图(只读)。(如果没有则为空) |
guiTexture | 附属于这个游戏物体上的GUI纹理(只读)。(如果没有则为空) |
collider | 附属于这个游戏物体上的碰撞器(只读)。(如果没有则为空) |
hingeJoint | 附属于这个游戏物体上的铰链关节(只读)。(如果没有则为空) |
particleEmitter | 附属于这个游戏物体上的粒子发射器(只读)。(如果没有则为空) |
layer | 游戏物体所在的层.一个层的范围是在[0...32]之间。 |
active | 标识游戏物体是否是活动的.使这个游戏物体活动/不活动 |
tag | 游戏物体的标签。 |
Constructors | 构造器 |
---|---|
GameObject | 构造一个游戏物体,赋予名称。 |
Functions | 函数 |
---|---|
GetComponent | 如果这个游戏物体包含一个类型为type的组件,则返回它.如果没有则为空.通过这个函数,你可以访问内建的组件或者脚本的组件. |
GetComponent | 如果游戏物体有一个附加组件,则返回名为type的组件,如果没有则为空。 |
GetComponentInChildren | 返回这个游戏物体或者它的所有子物体上(深度优先)的类型为type的组件. |
GetComponents | 返回这个游戏物体上的所有类型为type的组件. |
GetComponentsInChildren | 得到游戏物体或者其所有子物体上的所有类型为type的组件. |
SetActiveRecursively | 设置游戏物体及其子物体的状态为state. |
CompareTag | 是否这个游戏物体用tag标识? |
SendMessageUpwards | 在这个游戏物体及其祖先物体的所有MonoBehaviour中调用名称为methodName的方法. |
SendMessage | 在这个游戏物体上的所有MonoBehaviour上调用名称为methodName的方法. |
BroadcastMessage | 在这个游戏物体及其子物体的所有MonoBehaviour中调用名称为methodName的方法. |
AddComponent | 添加一个名称为className的组件到游戏物体. |
SampleAnimation | 为所有动画属性在某个给定时间为一个动画采样. |
Class Functions | 类函数 |
---|---|
CreatePrimitive | 创建一个带有基本网格渲染器和相应碰撞器的游戏物体。 |
FindWithTag | 返回一个用tag做标识的活动的游戏物体.如果没有找到则为空. |
FindGameObjectsWithTag | 返回一个用tag做标识的活动的游戏物体的列表.如果没有找到则为空. |
Find | 找到并返回一个名字为name的游戏物体. |
创建GameObject
1.通过构造函数构建
//新建一个空对象
var gameObject = new GameObject ("NewGameObj");
2.通过Prefab构建
Unity3D提供一种被称为Prefab的预置对象,它是以文件的形式保存在硬盘上的一个GameObject,它里面可能包含了各种设置,组件,还有一些脚本。Prefab允许我们在不同的Scene,甚至Project中使用同一个对象,例如我实现了一个子弹,通过打包成Prefab,我可以在另外一个游戏里面直接使用它。
当一个Prefab对象被修改的时候,它的所有实例都会相应地被修改
在代码里面动态地实例化一个Prefab对象
public GameObject prefab;
GameObject.Instantiate (prefab);
要先创建一个公有变量,然后把这个Prefab拖到这个变量上,然后才可以用它来实例化对象
通过Resources这个类的静态方法可以将Prefab对象动态加载进来,创建GameObject
//获得外部传入的一个prefab对象
car = GameObject.Instantiate (prefab);
car.transform.Rotate(new Vector3 (0, 135, 0));
3.创建简单的几何体(Primitive)
通过Hierarchy面板下的Create菜单可以手动地创建一个GameObject,它可以是一个相机,一个灯光,或者一个简单的模型,当我们要在程序里面动态地创建一个相机的时候,可以new一个GameObject,然后把Camera组件Add给它就可以了,创建灯光,GUI等也类似,但要创建简单模型的时候,我发现并没有类似Cube,Sphere这样的组件可供添加,后面知道,通过GameObject这个类的一个静态方法可以达到这个目的
static GameObject CreatePrimitive(PrimitiveType type);
可以根据PrimitiveType创建五种类型的基础模型
PrimitiveType.Plane PrimitiveType.Cube PrimitiveType.Sphere PrimitiveType.Capsule PrimitiveType.Cylinder
//创建简单的几何体
GameObject plane = GameObject.CreatePrimitive (PrimitiveType.Plane);
Renderer planeRenderer = plane.GetComponent<Renderer>();
planeRenderer.material.color = Color.green;
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube.transform.position = new Vector3 (0.0f, 0.5f, 0.0f);
Renderer cubeRenderer = cube.GetComponent<Renderer>();
cubeRenderer.material.color = Color.red;
销毁对象
调用Object的Destroy方法可以销毁一个GameObject,组件,或者资源。这是一个静态方法,函数的原型为
static void Destroy(Object obj, float t = 0.0F );
可以通过将this传入,销毁自己。
添加或移除组件
添加组件
//添加一个刚体
cube.AddComponent<Rigidbody>();
//添加一个其他脚本
cube.AddComponent<TestScript>();
移除组件
//移除脚本
Destroy(cube.GetComponent<TestScript>());
禁用和启用
activeSelf(read only只读):物体本身的active状态,对应于其在inspector中的checkbox是否被勾选
activeInHierarchy(read only只读):物体在层次中是否是active的。也就是说要使这个值为true,这个物体及其所有父物体(及祖先物体)的activeself状态都为true。
总结:
activeInHierarchy状态代表物体在场景中的实际的active状态。实际上代表的是物体及其所有祖先物体的activeSelf状态。而activeSelf对应于其在inspector中的checkbox是否被勾选
activeSelf状态代表物体自身的activeSelf状态,所以当物体本身activeSelf为true,而其所有祖先物体的activeSelf状态不全为true时,这个物体的activeInHierarchy状态为false。
activeSelf==物体自身
activeInHierarchy==物体自身及其所有祖先物体==物体在场景中实际上是否激活
至于SetActive,改变的是物体自身的activeSelf状态,所以,对一个物体SetActive时,其在场景中可能不会被激活,因为其祖先物体可能存在未被激活的。
SetActiveRecursively,改变物体自身及其所有子物体的activeSelf状态,相当于对物体自身及其所有子物体调用SetActive.
由于SetActiveRecursively已过时(obsolete),未来将移除,所以,当设置一个物体及其所有子物体的active状态时,可以调用一下方法
void DeactivateChildren(GameObject g, bool a) {
g.activeSelf = a;
foreach (Transform child in g.transform) {
DeactivateChildren(child.gameObject, a);
}
}
Tag和Name
GameObject的name和Tag可以直接设置,但Tag需要在标签管理器先定义一个Tag,这个Tag才可用,你不能将一个未定义的Tag赋给GameObject的Tag变量
查找
GameObject之间的通讯,在游戏中,我们往往需要知道其他对象的一些信息,所以我们经常需要动态地查询另外一个GameObject
FindWithTag 查找标签
返回一个用tag做标识的活动的游戏物体,如果没有找到则为空。
public GameObject respawnPrefab;
public GameObject respawn = GameObject.FindWithTag("Respawn");
public void Awake() {
Instantiate(respawnPrefab, respawn.transform.position, respawn.transform.rotation);
}
FindGameObjectsWithTag 查找标签的游戏物体列表
返回一个用tag做标识的活动的游戏物体的列表.如果没有找到则为空。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public GameObject respawnPrefab;
public GameObject[] respawns = GameObject.FindGameObjectsWithTag("Respawn");
public void Awake() {
foreach (GameObject respawn in respawns) {
Instantiate(respawnPrefab, respawn.transform.position, respawn.transform.rotation);
}
}
}
Find 查找
找到并返回一个名字为name的游戏物体。
如果以name为名字的游戏物体没有被找到,则返回空.如果name中包含'/'字符,这个名称将被视作一个hierarchy中的路径名.这个函数只返回活动的游戏物体。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public GameObject hand;
public void Awake() {
hand = GameObject.Find("Hand");
hand = GameObject.Find("/Hand");
hand = GameObject.Find("/Monster/Arm/Hand");
hand = GameObject.Find("Monster/Arm/Hand");
}
}
对象之间通信
BroadcastMessage 广播消息
对物体和所有子物体发送消息。
在这个游戏物体及其子物体的所有MonoBehaviour中调用名称为methodName的方法。
接收消息的方法可以通过不要参数的方法来选择忽略参数.当选项被设置为SendMessageOptions.RequireReceiver时,如果消息没有被任何一个组件处理,则会打印一个错误.如果为SendMessageOptions.DontRequireReceiver则没有任何组件处理消息也可以
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
}
public void Awake() {
gameObject.BroadcastMessage("ApplyDamage", 5.0F);
}
}
SendMessage 发送消息
向同级发送消息。
在这个游戏物体上的所有MonoBehaviour上调用名称为methodName的方法。
接收消息的方法可以通过不要参数的方法来选择忽略参数。当选项被设置为SendMessageOptions.RequireReceiver时,如果消息没有被任何一个组件处理,则会打印一个错误.如果为SendMessageOptions.DontRequireReceiver则没有任何组件处理消息也可以
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
}
public void Awake() {
gameObject.SendMessage("ApplyDamage", 5.0F);
}
}
SendMessageUpwards 向上发送消息
向物体和父物体发送消息
在这个游戏物体及其祖先物体的所有MonoBehaviour中调用名称为methodName的方法。
接收消息的方法可以通过不要参数的方法来选择忽略参数.当选项被设置为SendMessageOptions.RequireReceiver时,如果消息没有被任何一个组件处理,则会打印一个错误.如果为SendMessageOptions.DontRequireReceiver则没有任何组件处理消息也可以
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
}
public void Awake() {
gameObject.SendMessageUpwards("ApplyDamage", 5.0F);
}
}