阅读条件:默认阅读者对类、对象、面向对象的编程都能理解。
首先了解Unity和C#的命名规范。
unity3d 中的一些命名规范和代码风格,
Deb.Log()
来测试是否获取到了,且脚本对象的字段写成私有字段
这样做更不容易混淆掉。用public修饰
,拖拽物体对象来给字段赋值对象 并且写个文本来标记,或者在注释写个标记。可以看出,大驼峰的写法,暗示了是一个类型,
Gameobject
是一个类型,所有的游戏物件都是这个类型的对象。
gameobject
是一个对象, 就跟java里面的this一样, 指的是这个脚本所附着的游戏物件,是一个具体的物品,
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秒就删除,那么我们需要把删除的逻辑绑定到饼干还是饼干模具呢?
答案当然是饼干模具了!使得每个饼干的模具就有自动删除的属性。
上面的代码就是CoinDest的代码。
生成饼干的逻辑:
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上,具体详细过程:
物体的实例化
【参考网址】:https://blog.csdn.net/lxl_815520/article/details/53638481
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 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
官方文档的描述也是如此。
触发器、碰撞器区别和联系的 博客