Unity用脚本创建物体

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

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

而用脚本动态创建物体,即在游戏进行中创建物体,是一项基本技能,本文将详细讲解实现这一功能的基本方法


一、预制

预制就是一个物体的模版,在游戏开发中,一般将物体设为预制,详细见这篇文章:Unity入门

二、创建物体

利用预制创建物体,需要使用实例化方法Instantiate()。它需哟一个预制体的引用作为模版返回值总是新创建的那个物体的引用。如果预制体以GameObject类型传入,那么返回的结果也是GameObject类型。

在实际使用时,有时候要具体制定新建物体的位置、朝向和父物体,因此Intantiate()方法也有多重重载形式,区别在于参数不同。这里展示三种重载形式

重载形式

参数1

参数2

参数3

参数4

仅指定父物体

预制

父物体的Transform类型,null表示没有父物体,置于场景根节点

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

 

指定位置和朝向

预制

空间位置,世界坐标系,Vector3类型

朝向,Quaternion类型

 

指定位置、朝向和父物体

预制

空间位置,世界坐标系,Vector3类型

朝向,Quaternion类型

父物体的Transform类型,null表示没有父物体,置于场景根节点

预制体也可以用组件表示。由于组件可以代表所挂载的组件,因此如果以某个预制体上的组件作为模版,Instantiate方法依然会把该物体创造出来,同时返回新物体上同名的组件。这虽然保持了功能不变,但稍一不获取组件的操作。

下面举一个用脚本创建物体的例子

using UnityEngine;

 

public class TestInstantiate : MonoBehaviour

{

     public GameObject prefab;//设置为public,以便在编辑器中赋值

     void Start()

     {

       GameObject objA=Instantiate(prefab,null);//在场景根结点创建物体

       GameObject objB=Instantiate(prefab,transform);//创建一个物体,作为当前脚本所在物体的子物体

       GameObject objC=Instantiate(prefab,new Vecrtor3(3,0,3),Quaternion.identity);//创建一个物体,确定位置和朝向

     }

}

用脚本创建物体在一些需要摆放精准图形的时候也会用到,下面是用脚本创建10个物体摆放成一个环形的例子

using UnityEngine;

 

public class TestInstantiate : MonoBehaviour

{

     public GameObject prefab;

     void Start()

     {

         for(int i=0;i<10;i++)

        {

          Vector3 pos=new Vector3(Mathf.Cos(i*(2*Mathf.PI)/10),0,Mathf.Sin(i*(2*Mathf.PI)/10);//用到了sin和cos在x-y坐标系中的定义

          pos=pos*5;//半径=5

         Instantiate(prefab,pos,Quaternion.identity);

       }

     }

}

三、创建组件

通常使用GameObject.AddComponent()方法,以下代码先获取Cube物体,再给它添加Rigidbody组件

using UnityEngine;

 

public class TestInstantiate : MonoBehaviour

{

     void Start()

     {

        GameObject go=GameObject.Find("Cube");

         go.AddComponent<Rigidbody>();

     }

}

四、销毁物体或组件

使用Destroy()方法可以销毁物体或组件,这里就不展开例子了。

但在这里有一个要点要注意:在执行Destroy操作后,并不会立即销毁该物体,而是稍后放在合适的时机去销毁。这样就保证了在那一帧里,对该物体的操作不会产生错误。

在个别情况下如果需要立即销毁,Unity提供了DestroyImmediate()方法。

五、定时创建和销毁物体

游戏中延迟创建物体和延迟销毁物体是常见的需求。

延迟创建一般用于等待动画结束和定时刷新怪物等。延迟销毁物体则用于定时让子弹、尸体消失等情况。

延迟需要准确定时,如在未来的第几秒执行。这里举例用简易的Invoke方法。该方法有两个参数,第一个参数是以字符串表示的方法名称,第二个参数表示延迟的事件,单位为秒。

Invoke方法可以延迟调用一个方法,但要求该方法没有参数也没有返回值

下面例子为用Invoke方法编写一个每隔0.5秒生成一个物体的动态效果

Using UnityEngine;

public class TestInvoke : MonoBehaviour

{

   public Gameobject prefab;

   int counter=0;

   void Start()

   {

     Invoke("CreatePrefab",0.5f);

   }

   void CreatPrefab()

   {

         Vector3 POs=new Vector3(Mathf.Cos(counter*(2*Mathf.PI)/10),0,Mathf.Sin(counter*(2*Mathf.PI)/10));

          pos*=5;

          Instantiate(prefab,pos,Quaternion.identity);

          counter++;

          if(counter<10)

          {

          Invoke("CreatePrefab",0.5f);

          }

    }

}

延迟销毁也可以用Invoke实现,但由于延迟销毁需求更加厂家,因此Unity为Destroy方法增添了延时的功能,Destroy的第二个参数用于制定销毁延迟的事件,如:

Destroy(cube,0.5f);

 

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

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

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

相关文章

  • Unity通过脚本更改物体的材质

       

    2024年02月12日
    浏览(37)
  • Unity 用脚本获取物体和组件(上)

    一个游戏物体是一个对象;没有被挂到物体上的脚本,是一个未被实例化的类,暂时还不是具体的对象;当脚本被挂到物体上后,就成了一个实实在在的对象。 脚本在执行时,一般已经挂到了某个对象上。因此在脚本代码中,可以随时访问脚本目前挂到了那个对象上,直接用

    2024年02月16日
    浏览(38)
  • 7. unity脚本控制物体运动(转向、移动、旋转)

    1. 移动物体: 在界面中添加一个物体,并给这个物体添加一个脚本文件,在脚本文件当中如果想控制物体运动,就需要在 unity 每一帧更新的时候,给物体的坐标值重新赋值,这样就能按照帧更新速率实时的更改物体的位置,实现移动效果。 位置更新的代码应该写在***update

    2023年04月12日
    浏览(53)
  • unity如何禁用物体上的其他脚本

    transform.GetComponent类名().enabled = false; 这种方法不太靠谱,可能禁用脚本后还会执行,其他组件完全可以。 Destroy(transform.GetComponent类名()); 触发后直接销毁这个函数。 bool IsSucceed; 第一个脚本执行完后,就用IsSucceed锁死,不让再执行后面的操作。

    2023年04月10日
    浏览(33)
  • Unity 语法详解之查找游戏物体的方法(含查找隐藏物体)

    为了更好的看懂,有一个非常基础的知识,如果不知道可以移步去了解一下哦 unity | gameobject和transform的区别和关联通俗解释_gameobject transform_菌菌巧乐兹的博客-CSDN博客 一、前情提要 大写的 GameObject是个类,里面写满了物体有关的代码 小写的 gameObject指的是物体本身 大写的

    2024年02月12日
    浏览(46)
  • 编辑器脚本:Unity中如何查找哪些物体上有missing的脚本

    编辑器中选中物体,判断这些物体及子物体上是否有丢失的脚本 1、编辑器选中n个物体 2、获取这n个物体及其它们的子物体,数据集记为A 3、A中全部物体判断他们是否有null的脚本(MonoBehaviour) 4、判断一个物体(obj)是否有空脚本的关键语句: obj.GetComponentsMonoBehaviour().Any(mon

    2024年02月14日
    浏览(43)
  • 「unity技巧」如何查找脚本挂载在哪个物体(组件)上?

    目录 一、简单粗暴版方法 二、代码方式 这是场景。 我们要找的脚本: 在Hierarchy窗口中输入要找的 脚本名称 。 结果出现。 若需要运行中寻找挂载脚本的物体:

    2024年02月12日
    浏览(35)
  • 用于物体识别和跟踪的下游任务自监督学习-1-引言

    一:引言: 图像和视频理解是计算机视觉应用中的基本问题,旨在使机器能够像人类一样解释和理解视觉数据。这些问题涉及识别图像和视频中的对象、人物、动作、事件和场景。如图1.1-(a)所示的图像识别任务包括对象检测[1]、实例[7]、语义[8]或全景分割[9],以定位对象

    2024年02月07日
    浏览(43)
  • Unity上接入手柄,手柄控制游戏物体移动

    1、unity软件上安装system input 组件。菜单栏【window】-【Packag Manager】打开如下界面,查找Input System,并且安装。 2、安装成功后插入手柄到windows上,打开菜单栏上【window】--【Analysis】--【Input Debuger】 进入Input Debug界面,可以看到手柄设备能被Unity识别。 3、双击【XinputControllerW

    2024年04月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包