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);
    }
}

results matching ""

    No results matching ""