Unity API详解及实战系列之Object类

作为万类之祖,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);
        }
    }
}
  • 实例代码运行结果:

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值