Unity 用脚本获取物体和组件(上)

这篇具有很好参考价值的文章主要介绍了Unity 用脚本获取物体和组件(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、物体、组件和对象

一个游戏物体是一个对象;没有被挂到物体上的脚本,是一个未被实例化的类,暂时还不是具体的对象;当脚本被挂到物体上后,就成了一个实实在在的对象。

脚本在执行时,一般已经挂到了某个对象上。因此在脚本代码中,可以随时访问脚本目前挂到了那个对象上,直接用gameObject就行

下面两个都可以,this可以被省略

Debug.Log(gameObject.name);

Debug.Log(this.gameObject.name);

二、获取组件的方法

获得某个物体后,就可以通过物体获取到它的每一个组件。举个例子,新建一个Test脚本文件并挂到球体上,脚本内容保持默认,为了得到Sphere Collider组件,可以直接用GetComponent()方法,将Test脚本内容修改如下。

using UnityEngine;

public class Test : MonoBehaviour

{

      SphereCollider collider;

      void Start()

       {

           collider=gameObject.GetComponent<SphereCollider>();

       }

上述是很常见的获取组件的代码,即先从当前脚本获取到游戏物体,再到游戏物体中找到某个组件。

Transform组件也可以用GetComponent()方法获得,但是由于Transform组件非常常用,因此随时刻通过字段transform访问,不需要通过代码获取

Unity为了方便,设计了获取组件的简便写法。思路是,在同一个物体上,从任意一个组件出发都可以直接获取到其他组件,不需要先获取游戏物体。也就是说,获取组件的写法有很多等价的形式,举例如下

collider=gameObject.getComponent<SphereCollider>();

//下面每一句写法均与上面一句等价

collider=this.GetComponent<SphereCollider>();

collider=GetComponent<SphereCollider>();

collider=transform.GetComponent<SphereCollider>();

 如果需要获取多个相同组件,就要用到 GetComponents()方法,一般用一个数组存着。

三、获取物体的方法

1、通过名称获取物体

使用GameObject.Find()方法即可。举例:新建一个立方体,并挂一个TestGetObject脚本,内容如下

Public class TestGetGameObject : MonoBehaviour

{

     GameObject objMainCam;

     GameObject objMainLight;

     void Start()

     {

        objMainCam=GameObject.Find("Main Camera");

         objMainLight=GameObject.Find("Directional Light");

         Debug.Log(" 主摄像机:"+objMainCam.name);

         Debug.Log(" 主光源:"+objMainLight.name);

         //将主摄像机放在这个物体后方1m的位置

         objMainCam.transform.position=transform.position-transform.forward;

      }

}

GameObject.Find()方法比较常用,但它有两个弊端

  • 无法找到未激活的物体
  • 需要遍历场景中的所有物体,性能上来说非常低效     

为了验证第一个弊端,我们可以在上面的例子中,禁用场景光源(在Inspector窗口中取消勾选Drectional Light选项),这时再次运行,就会出现报错,异常类型为NullReferenceException(空引用)。双击该错误,就会定位到相应的源代码,源代码如下

Debug.Log(" 主光源:"+objMainLight.name);

这是由于其当前为空引用null,因此访问其name字段会报错。说明了GameObject.Find()方法的确无法找到未激活的物体

对于第二个弊端,在简单场景里很难察觉。而在一个完整的游戏中,场景中经常会有成千上万个物体,那时的效率差异就会想当明显。但这也不代表不能用GameObject.Find()方法。如果仅在Start方法中调用一次,然后将物体保存在objMainCam中,以后都不用重新查找,这样就不会产生明显的效率差异。

2、通过标签查找物体

通过例子来说明

//查找第一个标签为Player的物体

GameObject players=GameObject.FindGameObjectWithTag("Palyer");

//查找所有标签为Monster的物体,返回只是一个数组,结果可以是0个或多个

GameObject[] monsters=GameObject.FindGameObjectsWithTag("Monser");

 除了Inspector中修改物体的标签,在脚本中也可以,举例如下

GameObject m=GameObject.FindGameObjectWithTag("Player");

m.tag="Cube";

if(m.CompareTag("Cube")) //CompareTag用法等效于m.tag=="Cube",推荐使用CompareTag

{

......//略

}

 文章来源地址https://www.toymoban.com/news/detail-598558.html

 

 

到了这里,关于Unity 用脚本获取物体和组件(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

    ♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油! 加油! 加油 🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+! 提针对这个需求,以下是示例脚本代码: ♥️作者

    2024年02月12日
    浏览(44)
  • 1.Unity中c#代码学习(读取物体名称+位置+移动)

    Ctrl + K + C 批量注释 Ctrl + K + U 批量取消注释 Debug.Log(\\\"**\\\");输出“**”中内容 GameObject obj = this.gameObject; this表示当前指代的物品 GameObject表示游戏中物体 Debug.Log(\\\"** 物体名字:\\\" + this.gameObject.name); this.gameObject.name直接调用类名 string name = obj.name; string 是c#中的字符串类型 Debug.Log(\\\"**

    2023年04月11日
    浏览(48)
  • Unity获取物体组件的所有方法以及优缺点

    1.GetComponent(): 获取物体上的指定组件 T,如果物体上不存在该组件,则返回 null。 优点:简单易用,可以快速获取指定组件的实例,方便直接操作组件。 缺点:如果需要获取多个组件,需要多次调用该方法,较为繁琐。 2.GetComponentInChildren(): 在物体及其子物体中查找指定组件

    2024年02月13日
    浏览(44)
  • Unity之获取游戏物体对象或组件的几个方法

    在unity的实际项目开发中,往往都要获取游戏内的各种物体,比如玩家(Player),怪物(Monster),或者其他,那有什么方法可以快速获取呢,下面就来介绍unity获取游戏对象的几个方法 GameObject.Find GameObject.Find 通过游戏物体的名称获取对象 使用方法 缺点: 会遍历当前整个场

    2024年02月01日
    浏览(42)
  • Unity点击物体后,移动到物体所在位置

    脚本挂在被点击的物体上 脚本挂在角色控制器上 改进:使用Raycast中的LayerMask 创建“cube”层 将想要被检测的物体放入该层 3.1、 3D物体事件监听 在相机上挂Physics Raycaster组件 检查是否有EventSystem 将脚本挂在被点击的物体上 添加组件Event Trigger组件 3.2、 世界UI世界监听

    2024年02月07日
    浏览(52)
  • unity物体移动至指定位置

    在Unity中,物体的坐标分为 局部坐标 和 世界坐标 。 局部坐标是相对于物体的父对象的坐标系,而世界坐标是相对于场景的整体坐标系。 举个例子 将下面代码挂载到Sphere上 输出结果如下 如果想让物体运动到指定的位置,通常情况下是参考世界坐标系。因为世界坐标系是整

    2024年02月05日
    浏览(51)
  • Unity中拖拽3D物体并放入到指定位置

    1.新建一个cube作为我们用来拖拽的物体:  2.给该cube添加我们刚刚编写的脚本: 3.场景中新建几个cube命名为Taget3D,摆在不同的位置并将这些新的cube传入到ListTartgets中:    4.新建几个Image命名为TargetUI,放在不同的位置并传入到ListUITarget中 : 5.新建两个Button分别对应传入buttonU

    2024年02月11日
    浏览(99)
  • Unity用脚本创建物体

    引言: 在游戏设计中,需要用到的物体都可以用编辑器放在场景中。但很多时候,无法事先创建所有需要的物体,如子弹、刷新的怪物之类。这些要么是根据玩家操作而随时创建,要么是根据游戏玩法在特定时刻创建,都无法事先确定它们在什么时候出现。 而用脚本 动态

    2024年02月09日
    浏览(40)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(75)
  • 【Unity入门】11.脚本控制物体旋转

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (1)创建RotateLogic脚本     上一篇文章我们学习了如何在脚本中获取物体对象,并使用transform组件下的translate接口使物体运动     今天我们进一步学习,用脚本控制物体的旋转。首先

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包