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

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

首先了解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;
    }
}

这里

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

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

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

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

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

if (Input.GetKey(KeyCode.A))
            tf.Translate(Vector3.left, Space.World);

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

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

gameObject是当前游戏对象的实例。对象可以理解为一个饼干的模具,那么实例就是放进了饼干粉做成的真正的饼干。参考链接:物体的实例化
和预制体绑定的东西可以理解为饼干模具,那么对它进行实例化就是绑定了饼干。所以,例如用模具实例化了多个对象,现在要将这些“克隆饼干”生产出来后隔了3秒就删除,那么我们需要把删除的逻辑绑定到饼干还是饼干模具呢?
答案当然是饼干模具了!使得每个饼干的模具就有自动删除的属性。
【Unity】理解GameObject,gameObject,Transform,transform以及Collision,Collider的区别和联系_第1张图片
上面的代码就是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);
    }
}

这里的coin是预制体,拖入到左边的区域中,然后将脚本绑定到这个coin上,具体详细过程:
物体的实例化
【Unity】理解GameObject,gameObject,Transform,transform以及Collision,Collider的区别和联系_第2张图片

【参考网址】: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);
        
    }
}

而且可以看到,
这里的collision.gameObject 等于 collider
官方文档的描述也是如此。
【Unity】理解GameObject,gameObject,Transform,transform以及Collision,Collider的区别和联系_第3张图片

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

你可能感兴趣的:(unity)