作为万类之祖,Object类位于UnityEngine命名空间,它是Unity中所有类的基类,因此Object类中的属性及方法被Unity中所有的类继承。
目录
实例属性
一、接口 public string name { get; set; }
- 功能:获取或者设置一个对象的名字。
- 说明:如果是对象是GameObect,则它表示该gameObect在Hierarchy面板上的名称;不同的对象可以有相同的name。
- 实例演练:获取和设置GameObject的名字。
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
private void Start()
{
var gameObjectName = gameObject.name;//获取
Debug.Log("gameObjectName :" + gameObjectName);
gameObject.name = "NewGameObjectName";//设置
}
}
}
- 实例运行结果:
二、接口:public HideFlags hideFlags { get; set; }
- 功能:在编辑器中各面板中控制对象销毁、保存和可见性。
- 说明:当一个对象被创建,Unity默认的hideFlags 值为None,表示一个正常的、可见的对象。只有在特殊的情况下设置hideFlags 的值才能在编辑器中各面板中控制对象销毁、保存和可见性。
- 属性类型标志枚举详解:
namespace UnityEngine
{
/// <summary>
/// 在编辑器中各面板中控制对象销毁、保存和可见性的位标记
/// </summary>
[Flags]
public enum HideFlags
{
/// <summary>
/// 默认状态,一个正常的、可见的对象
/// </summary>
None = 0,
/// <summary>
/// 在hierarchy面板中隐藏
/// </summary>
HideInHierarchy = 1,
/// <summary>
/// 在inspector面板中隐藏
/// </summary>
HideInInspector = 2,
/// <summary>
/// 对象将不会保存到编辑器中的场景中。
/// </summary>
DontSaveInEditor = 4,
/// <summary>
/// 对象不能在inspector面板中编辑。
/// </summary>
NotEditable = 8,
/// <summary>
/// 当构建打包时,对象将不会被保存。
/// </summary>
DontSaveInBuild = 16,
/// <summary>
/// 对象不会被Resources.UnloadUnusedAssets卸载。
/// </summary>
DontUnloadUnusedAsset = 32,
/// <summary>
///对象将不会保存到场景中、也不会在新场景加载时销毁。值为 HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.DontUnloadUnusedAsset。
/// </summary>
DontSave = 52,
/// <summary>
///对象不会显示在Hierarchy面板中、不会保存到场景中、也不会被Resources.UnloadUnusedAssets卸载。
/// </summary>
HideAndDontSave = 61
}
}
- 实例演练:设置对象不能在inspector面板中编辑
using System;
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
private void Start()
{
gameObject.hideFlags = HideFlags.NotEditable;//设置对象不能在inspector面板中编辑
}
}
}
- 实例运行结果:
实例方法
一、接口 public int GetInstanceID();
- 功能:获取一个对象的实例ID(int 类型)。
- 说明:实例ID在程序运行期间,是该对象的唯一标志,除非对象被销毁,否则实例ID不会改变;无论是新建的对象还是克隆的对象,对象的名称(name是Object类的实例属性)可以相同,但实例ID一定不同;一般在对象池机制中,有大量克隆物体,虽然他们来自同一个模板,但是每个对应拥有独立的生命周期,这时实例ID就显得非常有用。
- 实例演练:下面代码测试通过几种不同方式得到对象的实例ID,包括场景中已经存在的GameOject和其上组件的实例ID、新建GameOject和其上组件的实例ID、克隆GameOject和其上组件的实例ID。
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
private void Start()
{
//脚本挂载的GameObject实例ID和Transfom组件的实例ID
Debug.Log("curGameObject ID :" + gameObject.GetInstanceID());
Debug.Log("curtransform ID :" + transform.GetInstanceID());
//新建GameObject实例ID和Transfom组件的实例ID
var newGameObject = new GameObject("newGameObject");
Debug.Log("newGameObject ID :" + newGameObject.GetInstanceID());
Debug.Log("newTransform ID :" + newGameObject.transform.GetInstanceID());
//克隆GameObject实例ID和Transfom组件的实例ID
var cloneGameObject = Instantiate(newGameObject);
Debug.Log("cloneGameObject ID :" + cloneGameObject.GetInstanceID());
Debug.Log("cloneTransform ID :" + cloneGameObject.transform.GetInstanceID());
}
}
}
- 实例运行结果
静态方法
一、接口:public static void Destroy(Object obj);
public static void Destroy(Object obj, [DefaultValue("0.0F")] float t);
- 功能:销毁一个对象,重载方法参数t为float类型,表示延迟多少秒销毁对象。
- 说明:可以销毁一个gameObject,也可以销毁一个组件(不能单独销毁Transform组件,该组件只能随着gameObject的销毁而销毁),如果是销毁一个gameObject,则该gameObject上挂载的所有组件都将被销毁。
- 实例演练:
using System;
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
private void Start()
{
var capsuleGameObject = GameObject.CreatePrimitive(PrimitiveType.Capsule);//创建系统自带的胶囊体
var rigidbodyComponent = capsuleGameObject.AddComponent<Rigidbody>();//添加刚体组件
Destroy(rigidbodyComponent);//销毁刚体组件
Destroy(capsuleGameObject,2f); //延迟2秒销毁胶囊体
}
}
}
二、接口:public static void DontDestroyOnLoad(Object target);
- 功能:设置target对象在场景切换时,保存在新的场景下。
- 说明:如果target为hierarchy面板中位于顶层的gameObject或者顶层gameObject上的组件时,直接调用DontDestroyOnLoad(target)就能保存在新场景中;如果target为hierarchy面板中非顶层的gameObject或者非顶层gameObject上的组件时,则必须先让target在Hierarchy面板上的层级关系位于顶层,再调用DontDestroyOnLoad(target)才能保存在新场景中。
- 实例演练:
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
public GameObject go1, go2;
private void Start()
{
DontDestroyOnLoad(go1);
go2.transform.parent.DetachChildren();//脱离父子关系,让在物体位于层级面板的顶层
DontDestroyOnLoad(go2);
SceneManager.LoadSceneAsync("MapScene", LoadSceneMode.Single);//异步加载场景
}
}
}
- 实例代码运行结果:
运行前 运行后
三、接口:public static T FindObjectOfType<T>() where T : Object;
public static T[] FindObjectsOfType<T>() where T : Object;
public static Object[] FindObjectsOfType(Type type);
- 功能:获取符合参数类型的对象,可以时GameObject也可以时Componet;该方法会遍历整个工程,第一个接口获取符合参数类型的第一个对象,后面两个接口获取工程中符合参数类型的所有对象。
- 说明:由于该接口会遍历整个功能,比较耗时,不宜在每帧中调用;尽量不要使用,如果一定要使用,可在执行一次的地方使用,可将查询结果缓存起来,以便后续使用;如果时后面两个接口,获取的是一个对象数组,可以通过name、InstaceID或者其他的特征对集合来进行筛选找到需要的对象。
- 实战演练:
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
private void Start()
{
//让场景中所有标记标签为“敌人”的刚体 重力感应失效
Rigidbody[] rigidbodys = FindObjectsOfType(typeof(Rigidbody)) as Rigidbody[];
if (rigidbodys != null)
{
foreach (var rd in rigidbodys)
{
if (rd.tag == "敌人")
{
rd.useGravity = false;
}
}
}
//10秒后清空场景 销毁场景中所有的物体
GameObject[] gameObjects = FindObjectsOfType(typeof(GameObject)) as GameObject[];
if (gameObjects != null)
{
foreach (var go in gameObjects)
{
Destroy(go, 10f);
}
}
}
}
}
四、接口:public static Object Instantiate(Object original);
public static Object Instantiate(Object original, Transform parent);
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
- 功能:以original为源对象克隆一个新对象。
- 说明:original必须时Unity的gameObject或者组件;如果original是gameObject则会克隆一个新的gameObject及它所有的子物体,它们的相对层级关系不会改变,并返回新的gameObject;如果original为组件时则会以组件所在的gameObject为源对象克隆一个新的gameObject及它所有的子物体,它们的相对层级关系不会改变,并返回新的gameObject上original类型的组件;重载方法都是用来设置克隆对象的transfomr参数:parent为克隆对象的父物体、position为克隆对象局部空间下的位置、rotation为克隆对象局部空间下的旋转;只有使用第二个重载方法时当参数instantiateInWorldSpace值为true时,从源对象克隆到的transfrom局部空间下的参数都会以世界空间下的参数来设置克隆对象。
- 实例演练:
using UnityEngine;
namespace Assets.Scripts
{
public class UnityApiScript : MonoBehaviour
{
public GameObject originalGameObject;
public MeshRenderer originalMeshRenderer;
private void Start()
{
var newGameObjectClone = Instantiate(originalGameObject);
Debug.Log("originalGameObject :" + originalGameObject);
Debug.Log("newGameObjectClone :" + newGameObjectClone);
var newMeshRenderer = Instantiate(originalMeshRenderer);
Debug.Log("originalMeshRenderer :" + originalMeshRenderer);
Debug.Log("newMeshRenderer :" + newMeshRenderer);
}
}
}
- 实例代码运行结果: