阅读条件:默认阅读者对 类 、对象、面向对象的编程都能理解。
首先了解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; } }csharp运行
这里
tf = gameObject.GetComponent<Transform>(); //通过对当前脚本绑定的对象使用csharp运行
也可以改为下面这样,但是上面这样的语义显然更加清晰。
tf = GetComponent<Transform>(); //通过对当前脚本绑定的对象使用csharp运行
Transform是一个类,用来描述物体的位置,大小,旋转等等信息,也就是一些和形状,位置相关的信息。transform是Transform类的对象,依附于每一个物体。也是当前游戏对象的一个组件(每个对象都会有这个组件)
上面的代码的tf是当前脚本绑定的游戏对象的transform组件,可以利用这个组件,调用函数
if (Input.GetKey(KeyCode.A)) tf.Translate(Vector3.left, Space.World);csharp运行
更改当前的游戏对象的位置,或者进行旋转等等操作。
if (Input.GetKeyDown(KeyCode.Z)) tf.Rotate(Vector3.down, 90); //按下Z键让物体沿世界坐标系前方旋转90°csharp运行
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); } }csharp运行
这里的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
官方文档的描述也是如此。