许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  【Unity】理解GameObject,gameObject,Transform,transform以及Collision,Collider的区别和联系

【Unity】理解GameObject,gameObject,Transform,transform以及Collision,Collider的区别和联系

阅读数 5
点赞 0
article_banner

阅读条件:默认阅读者对 、对象、面向对象的编程都能理解。

首先了解Unity和C#的命名规范。
unity3d 中的一些命名规范和代码风格

  • 如果脚本要获取其他脚本对象如要要拖入一些物体对象时要注释一下,不然会忘记,如果通过代码获取对象记得用Deb.Log()来测试是否获取到了,且脚本对象的字段写成私有字段这样做更不容易混淆掉。
  • 如果外部其他类要调用这个字段,则只能用public修饰,拖拽物体对象来给字段赋值对象 并且写个文本来标记,或者在注释写个标记。

可以看出,大驼峰的写法,暗示了是一个类型,
Gameobject是一个类型,所有的游戏物件都是这个类型的对象。
gameobject是一个对象, 就跟java里面的this一样, 指的是这个脚本所附着的游戏物件,是一个具体的物品,

CoinDest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoinDest : MonoBehaviour
{
    public GameObject Mycoin; //定义GameObject类型的指针,
    private Transform tf;    //私有Transform组件
    static float sp = 1.1f;
    // Start is called before the first frame update
    void Start()
    {
        tf = gameObject.GetComponent<Transform>();  //通过对当前脚本绑定的对象使用GetComponent函数获取了组件
        GameObject.Destroy(gameObject, 20);// 销毁当前的游戏对象,注意到这里是GameObject.Destroy的方式调用,是静态工厂方法。
    }
    // Update is called once per frame
    void Update()
    {
        tf.Rotate(new Vector3(0, 0, 1), sp);
    }
    void Slower()
    {
        sp = sp * 0.95f;
    }
}

csharp
运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这里

 tf = gameObject.GetComponent<Transform>();  //通过对当前脚本绑定的对象使用
csharp
运行
  • 1

也可以改为下面这样,但是上面这样的语义显然更加清晰。

 tf = GetComponent<Transform>();  //通过对当前脚本绑定的对象使用
csharp
运行
  • 1

Transform是一个类,用来描述物体的位置,大小,旋转等等信息,也就是一些和形状,位置相关的信息。
transformTransform类的对象,依附于每一个物体。也是当前游戏对象的一个组件(每个对象都会有这个组件)

上面的代码的tf是当前脚本绑定的游戏对象的transform组件,可以利用这个组件,调用函数

if (Input.GetKey(KeyCode.A))
            tf.Translate(Vector3.left, Space.World);
csharp
运行
  • 1
  • 2

更改当前的游戏对象的位置,或者进行旋转等等操作。

if (Input.GetKeyDown(KeyCode.Z))
            tf.Rotate(Vector3.down, 90);           //按下Z键让物体沿世界坐标系前方旋转90°
csharp
运行
  • 1
  • 2

gameObject是当前游戏对象的实例。对象可以理解为一个饼干的模具,那么实例就是放进了饼干粉做成的真正的饼干。参考 链接 物体的实例化
和预制体绑定的东西可以理解为饼干模具,那么对它进行实例化就是绑定了饼干。所以,例如用模具实例化了多个对象,现在要将这些“ 克隆 饼干”生产出来后隔了3秒就删除,那么我们需要把删除的逻辑绑定到饼干还是饼干模具呢?
答案当然是饼干模具了!使得每个饼干的模具就有自动删除的属性。
在这里插入图片描述
上面的代码就是CoinDest的代码。

生成饼干的逻辑:

CoinPrint.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoinPrint : MonoBehaviour
{
    public GameObject Mycoin;
    // Start is called before the first frame update
    void Start()
    {
        InvokeRepeating("CreateCoin", 3, 2f);
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.C))
        {
            CancelInvoke();
        }
    }
    void CreateCoin()
    {
        float x, z;
        x = Random.Range(-20.3f, 20.3f);
        z = Random.Range(-20.3f, 20.3f);
        GameObject.Instantiate(Mycoin, new Vector3(x, (float)0.05, z), Quaternion.identity);
    }
}

csharp
运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

这里的coin是预制体,拖入到左边的区域中,然后将脚本绑定到这个coin上,具体详细过程:
物体的实例化
在这里插入图片描述

【参考网址】:https://blog.csdn.net/lxl_815520/article/details/53638481

gameobject.transform与transform.gameobject

gameobject.transform,是获取当前游戏对象的transform组件,最后得到了transform组件的引用。
所以在start函数中 gameobject.transform 和this.transform,指向的都是同一个对象。即:gameobject.transform == this.transform == transform

transform.gameobject:可以这么理解为:获取当前transform组件所在的gameObject,最后得到了当前对象的引用
所以在start()函数中transform.gameobject == this.gameobject == gameobect

Collision和Collider

Collision coll是碰撞类型,
Collider是触发器,
碰撞和触发是相悖的,能调用OnCollisionEnter,就不能调用OnTriggerEnter
其中,下面两种调用都可以。

void OnCollisionEnter(Collision coll)
{
    Debug.Log("Eat A Coin.");
    if (coll.gameObject.tag == "coin")//如果是和金币发生碰撞
    {
        coll.gameObject.SendMessage("Slower"); // 必须先发送消息再消除,否则空引用
        GameObject.Destroy(coll.gameObject);
        
    }
}

void OnTriggerEnter(Collider coll)
{
    Debug.Log("Eat A Coin.");
    if (coll.gameObject.tag == "coin")//如果是和金币发生碰撞
    {
        coll.SendMessage("Slower"); // 必须先发送消息再消除,否则空引用
        GameObject.Destroy(coll.gameObject);
        
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

而且可以看到,
这里的collision.gameObject 等于 collider
官方文档的描述也是如此。
在这里插入图片描述

触发器、碰撞器区别和联系的 博客


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空