Unity API 解析(3)—— GameObject 类

GameObject 类是Unity场景中所有实体的积累。一个GameObject对象通常由多个组件component组成,且至少含有一个transform组件。

 

activeSelf 属性 —— GameObject的Active标识

activeInHierarchy 属性的功能是返回GameObject实例在程序运行时的激活状态,它只有当GameObect实例的状态被激活时才会返回true。而且它会受父类对象激活状态的影响。如果其父类至最顶层的对象中有一个对象未被激活,activeInHierarchy就会返回false

using UnityEngine;
using System.Collections;

public class ActiveSelf_ts : MonoBehaviour {
    public GameObject cube1, cube2, cube3;
	void Start () {
        // 对cube2设置为false,其他设置为true
        cube1.SetActive(true);
        cube2.SetActive(false);
        cube3.SetActive(true);

        Debug.Log("activeSelf:");
        // 尽管cube2被设置为false,但其子类cube3的activeSelf返回值仍然为true
        Debug.Log("cube1.activeSelf:" + cube1.activeSelf);
        Debug.Log("cube2.activeSelf:" + cube2.activeSelf);
        Debug.Log("cube3.activeSelf:" + cube3.activeSelf);

        Debug.Log("\nactiveInHierarchy:");
        // cube2 和 cube3的activeInHierarchy返回值都为false
        Debug.Log("cube1.activeInHierarchy:" + cube1.activeInHierarchy);
        Debug.Log("cube2.activeInHierarchy:" + cube2.activeInHierarchy);
        Debug.Log("cube3.activeInHierarchy:" + cube3.activeInHierarchy);
	}
}

GameObject 构造方法

public GameObject();

public GameObject(string name);

public GameObject(string name,params Type[] components)

using UnityEngine;
using System.Collections;

public class Constructors_ts : MonoBehaviour {
	void Start () {
        // 使用构造函数 GameObject (name : String)
        GameObject g1 = new GameObject("G1");
        g1.AddComponent<Rigidbody>();
        // 使用构造函数 GameObject ()
        GameObject g2 = new GameObject();
        g2.AddComponent<FixedJoint>();
        // 使用构造函数 GameObject (name : String, params components : Type[])
        GameObject g3 = new GameObject("G3",typeof(MeshRenderer),typeof(Rigidbody),typeof(SpringJoint));

        Debug.Log("g1 name:" + g1.name + "\nPosition:" + g1.transform.position);
        Debug.Log("g2 name:" + g2.name + "\nPosition:" + g2.transform.position);
        Debug.Log("g3 name:" + g3.name + "\nPosition:" + g3.transform.position);
	}
}

GameObject 类实例方法

GetComponent 方法 —— 获取组件

public T GetComponent<T>() where T: Component;

public Component GetComponent(string type);

public Component GetComponent(Type type);

using UnityEngine;
using System.Collections;

public class GetComponent_ts : MonoBehaviour {
	void Start () {
        Debug.Log("以下是GetComponent 的相关使用代码。\n GetComponet 方法用来获取当前GameObject中符合Type类型的第一个组件");
        //GetComponent (type : Type)
        Rigidbody rb = GetComponent(typeof(Rigidbody))as Rigidbody;
        Debug.Log("使用 GetComponent (type : Type) 获取 Rigidbody" + rb.GetInstanceID());

        //GetComponent.<T>()
        rb=GetComponent<Rigidbody>();
        Debug.Log("使用 GetComponent.<T>()获取 Rigidbody" + rb.GetInstanceID());

        //GetComponent (type : String)
        rb = GetComponent("Rigidbody") as Rigidbody;
        Debug.Log("使用 GetComponent (type : String)获取 Rigidbody" + rb.GetInstanceID());

        Debug.Log("以下是GetComponentInChildren的相关使用代码。\n GetComponentInChildren 方法来获取当前GameObject的所有子类中符合Type类型的第一个组件");

        //GetComponentInChildren (type : Type)
        rb = GetComponentInChildren(typeof(Rigidbody)) as Rigidbody;
        Debug.Log("使用GetComponentInChildren (type : Type)获取Rigidbody " + rb.name);

        //GetComponentInChildren.<T> ()
        rb=GetComponentInChildren<Rigidbody>();
        Debug.Log("使用GetComponentInChildren.<T>()获取Rigidbody " + rb.name);

        //GetComponents (type : Type)
        Component[] cjs = GetComponents(typeof(ConfigurableJoint)) as Component[];
        foreach(ConfigurableJoint cj in cjs){
            Debug.Log("使用GetComponents (type : Type)获取ConfigurableJoint " + cj.GetInstanceID());
        }

        //GetComponents.<T> ()
        cjs = GetComponents<ConfigurableJoint>();
        foreach (ConfigurableJoint cj in cjs)
        {
            Debug.Log("使用GetComponents.<T>()获取ConfigurableJoint " + cj.GetInstanceID());
        }

        //GetComponentsInChildren(type: Type, includeInactive: boolean = false)
        cjs = GetComponentsInChildren(typeof(ConfigurableJoint), false) as Component[];
        foreach (ConfigurableJoint cj in cjs)
        {
            Debug.Log("使用GetComponentsInChildren(type: Type, false)获取ConfigurableJoint " + cj.name);
        }

        cjs = GetComponentsInChildren(typeof(ConfigurableJoint), true) as Component[];
        foreach (ConfigurableJoint cj in cjs)
        {
            Debug.Log("使用GetComponentsInChildren(type: Type, true)获取ConfigurableJoint " + cj.name);
        }

        //GetComponentsInChildren.<T> (includeInactive : boolean)
        cjs = GetComponentsInChildren<ConfigurableJoint>(true);
        foreach (ConfigurableJoint cj in cjs)
        {
            Debug.Log("使用GetComponentsInChildren.<T>(includeInactive : boolean)获取ConfigurableJoint " + cj.name);
        }

        //GetComponentsInChildren.<T> ()
        cjs = GetComponentsInChildren<ConfigurableJoint>();
        foreach (ConfigurableJoint cj in cjs)
        {
            Debug.Log("使用GetComponentsInChildren.<T>()获取ConfigurableJoint " + cj.name);
        }
	}
}

SendMessage 方法:发送消息

和自身同级的物体不会收到消息

SendMessageOptions 有两个可选方式:SendMessageOptions.RequireReceiver 和 SendMessageOptions.DontRequireReceiver 前者要求信息的接收方必须有接收信息的方法,否则程序报错,后者无此要求

BroadcastMessage 向自身以及所有子类发送消息,和自身同级的物体不会收到消息

SendMessageUpwards 方法的功能是向GameObject 自身及其所有父类发送消息,和自身同级的物体不会受到消息

using UnityEngine;
using System.Collections;

public class SendMessageUpward_ts : MonoBehaviour {
	void Start () {
		// 向父类及自己发送消息
        gameObject.SendMessageUpwards("GetChildrenMessage", gameObject.name + ":use SendMessageUpwards send!");

		// 向子类及自己发送消息
		gameObject.BroadcastMessage ("GetParentMessage ",gameObject.name +":use BroadcastMessage send");

		// 向自己发送消息
		gameObject.SendMessage ("GetSelfMessage",gameObject.name +" : use SendMessage send");
	}
    private void GetParentMessage(string str)
    {
        Debug.Log(gameObject.name + "收到父类发送的消息" + str);
    }

    private void GetSelfMessage(string str)
    {
        Debug.Log(gameObject.name + "受到自身发送的消息" + str);
    }

    private void GetChildrenMessage(string str)
    {
        Debug.Log(gameObject.name + "受到子类发送的消息" + str);
    }
}

 

CreatePrimitive —— 创建GameObject 对象

静态方法

using UnityEngine;
using System.Collections;

public class CreatePrimitive_ts : MonoBehaviour
{
    void Start()
    {
        // 使用GameObject.CreatePrimitive方法创建 GameObject
        GameObject g1 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        g1.name = "G1";
        g1.tag = "sphere_Tag";
        // 使用 AddComponent (className : String)添加组件
        g1.AddComponent("SpringJoint");
        // 使用AddComponent (componentType : Type)添加组件
        g1.AddComponent(typeof(GUITexture));
        g1.transform.position = Vector3.zero;

        GameObject g2 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        g2.name = "G2";
        g2.tag = "sphere_Tag";
        // 使用AddComponent.<T>() 添加组件
        g2.AddComponent<Rigidbody>();
        g2.transform.position = 2.0f * Vector3.right;
        g2.GetComponent<Rigidbody>().useGravity = false;

        GameObject g3 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        g3.name = "G1";
        g3.tag = "sphere_Tag";
        g3.transform.position = 4.0f * Vector3.right;

        // 使用GameObject.Findà类方法获取GameObject,返回符合条件的第一个对象
        Debug.Log("use Find:" + GameObject.Find("G1").transform.position);
        // 使用GameObject.FindGameObjectWithTag类方法获取GameObject,返回符合条件的第一个对象
        Debug.Log("use FindGameObjectWithTag:" + GameObject.FindGameObjectWithTag("sphere_Tag").transform.position);
        // 使用GameObject.FindGameObjectsWithTag类方法获取GameObject,返回符合条件的所有对象
        GameObject[] gos = GameObject.FindGameObjectsWithTag("sphere_Tag");
        foreach (GameObject go in gos)
        {
            Debug.Log("use FindGameObjectsWithTag:" + go.name + ":" + go.transform.position);
        }

			// 更改 g1,g2,和g3的层级关系
        g3.transform.parent = g2.transform;
        g2.transform.parent = g1.transform;

        Debug.Log("use Find again1:" + GameObject.Find("G1").transform.position);
        // 使用“/” 限定条件的方式查找GameObject
        Debug.Log("use Find again2:" + GameObject.Find("/G1/G2/G1").transform.position);
    }
}

 

若要获取当前脚本所在GameObject对象中的某个组件,直接使用GetCompoent方法即可,如

Rigidbody br = GetComponent<Rigidbody>()

若要获取非当前脚本所在GameObject对象中的某个组件,则需要有GameObject作为前置引用,如变量go为指向GameObject对象的引用,则

Rigidbody br = go.GetComponent<Rigidbody>()

using UnityEngine;
using System.Collections;

public class GameObjectAndComponent_ts : MonoBehaviour {
    public GameObject sp;
	void Start () {
        //以下3种表达方式功能相同
        Rigidbody rb1 = rigidbody;
        Rigidbody rb2 = GetComponent<Rigidbody>();
        Rigidbody rb3 = rigidbody.GetComponent<Rigidbody>();
        Debug.Log("rb1μ?InstanceID£o" + rb1.GetInstanceID());
        Debug.Log("rb2μ?InstanceID£o" + rb2.GetInstanceID());
        Debug.Log("rb3μ?InstanceID£o" + rb3.GetInstanceID());

        // 使用前置引用获取引用对象的Rigidbody组件
        Debug.Log("前置引用sp对象中Rigidbody的InstanceID "+sp.GetComponent<Rigidbody>().GetInstanceID());
	}
}
时间: 2024-12-23 22:59:24

Unity API 解析(3)—— GameObject 类的相关文章

Unity API 解析 学习

1 Application类 2 Camera类 3 GameObject类 4 HideFlags类 5 Mathf类 6 Matrix4x4类 7 Object类 8 Quaternion类 9 Random类 10 Rigidbody类 11 Time类 12 Transform类 13 Vector2类 14 Vector3类 1 Application类 1 using UnityEngine; 2 using System.Collections; 3 4 public class

Unity API 解析(7)&mdash;&mdash; Object 类

Object 类是Unity中所有对象的基类   GetInstanceID -- Object 对象ID 每个对象在工程中都有唯一的ID,并且从程序开始运行到结束,除非对象被销毁,否则每个实例对应的ID都不会改变 从GameObject.CreatePrimitive() 或 Object.Instantiate() 中创建或克隆的每个名字相同的GameObject对象都有唯一的ID using UnityEngine; using System.Collections; public cla

Unity API 解析(9)&mdash;&mdash; Rigidbody 类

模拟 GameObject 对象在现实世界中的物理特性(重力,阻力,质量,速度) 对Rigidbody 对象属性的赋值代码通常放在脚本的OnFixedUpdate 方法中   collisonDetectionMode 属性 -- 碰撞检测模式 刚体的碰撞检测模式有3种 Discrete -- 静态离散检测模式 Continuous -- 静态连续监测模式 ,一般用在高速运动刚体的目标碰撞体上 ContinousDynamic -- 最强的连续动态检测模式 drag 属性 -- 刚体阻力 dra

Unity API 解析(4)&mdash;&mdash; HideFlags 类

HideFlags 为枚举类,用于控制object对象的销毁方法以其在监视面板中的可视性   DontSave 保留对象到新场景 如果GameObject 对象被HideFlags.DontSave标识,则在新Scene中GameObject的所有组件将被保留下来,但其子类GameObject对象不会被保留到新scene中 不可对GameObject对象的某个组件如Transform进行HideFlags.DontSave标识,否则无效 即使程序已经退出,被HIdeFlags.DontSave

Unity API 解析(2)&mdash;&mdash; Camera 类属性

aspect属性 -- 摄像机视口比例 public float aspect {get ; set ;} 用于获取或设置camera适口的宽高比例值 aspect 只处理摄像机可以看到的试图的宽高比例,而硬件显示屏的作用只是把摄像机的内容显示出来,当硬件显示屏的宽高比例与aspect的比例值不同时,视图将发生变形 using UnityEngine; using System.Collections; public class Aspect_ts : MonoBehaviour { void

Unity API 解析(9)&mdash;&mdash; Random 类

不可实例化,只有静态属性和静态方法 insideUnitCircle -- 园内随机点 返回半径为1的园内的随机点坐标,Vector2类型 insideUnitSphere -- 半径为1的球内的随机点坐标 onUnitShper  -- 半径为1的球表面的随机点的坐标 using UnityEngine; using System.Collections; public class insideUnitCircle_ts : MonoBehaviour { public GameObject

Unity API 解析(8)&mdash;&mdash; Quaternion 类

四元数 -- 由x,y,z 和 w 这4个分量组成,属于struct 类型 用来存储和表示对象的选择角度   eulerAngles 属性 -- 欧拉角 对GameObject 对象的Transform进行欧拉角的变换次序是,先绕z轴旋转相应的角度,再绕x轴旋转相应的角度,最后y轴 -- 不同的旋转次序得到的最终状态不同 using UnityEngine; using System.Collections; public class EulerAngle_ts : MonoBehaviour

Unity API 解析(10)&mdash;&mdash; Time 类

realtimeSinceStartup 属性 -- 程序运行实时时间   smoothDeltaTime 属性 -- 平滑时间间隔 主要用在 FixedUpdate 方法中需要平滑过渡的计算   time 属性 -- 程序运行时间 从游戏启动到现在

Unity API 解析(5)&mdash;&mdash; Mathf 类

此类属于结构体类型,只有静态属性和静态方法,不可实例化 Deg2Rad 属性 -- 从角度到弧度常量 (2*PI)/360 Rad2Deg 属性 -- 从弧度到角度常量 Infinity 属性 -- 正无穷大   Clamp 方法 -- 返回有限范围值 返回有范围限制的value值 ClosestPowerOfTwo -- 返回2的某次幂 用于返回最接近参数值value的2的某次幂的值 DeltaAngle -- 最小增量角度 (-180,180] InverseLerp -- 计算比例值 (v