实例化出来的子弹需要撞击砖块,就要有一个速度,那么给子弹添加一个具有物理效果的组件“Rigidbody(刚体)”,这样就可以通过Rigidbody组件给子弹施加力,从而具有速度,具备撞击砖块的能力。
给子弹添加力:先获取Rigidbody(刚体)组件,再利用它给子弹施加力。
1.声明
在C#中,变量的声明格式为:
数据类型 变量名;
变量的赋值格式为:
变量名 = 数据;
就像“public float speed;”中,speed是浮点数的代表,声明“rigidbody”来代表Rigidbody组件:
Rigidbody rigidbody;
2.获取组件
声明了“rigidbody”是刚体组件的代表后,还需要访问刚体组件才可以调用相关数据:
rigidbody=GetComponent<Rigidbody>();
意为“rigidbody”访问了“Rigidbody”组件,有权使用相关数据了。
上面两个代码可以简化为:
Rigidbody rigidbody = GetComponent<Rigidbody>();
但是要注意,当前“发射子弹”脚本是挂载在相机下面,是相机的组件,“GetComponent<Rigidbody>”访问的是相机的刚体,明显不对,应该访问实例的刚体组件。
怎么访问实例的刚体组件呢?
首先要明白的是:
“rigidbody=GetComponent<Rigidbody>;”是“rigidbody=This.GetComponent<Rigidbody>;”的简化版,“this”被略写。
这是什么意思呢?就是“This”脚本所在物体,代表的是相机。所以把“this”换成代表实例的不就可以了?
所以声明一个代表实例的变量名,再用刚体组件的代表访问实例的刚体组件,进而控制实例:
GameObject 实例;
由于实例“Instantiate”会返回返回实例化的克隆,所以:
实例=GameObject.Instantiate(子弹,transform.position,transform.rotation);
上面两个代码可以简化为:
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);----A
意为:实例化一个实例后,用“实例”代表实例物体。
所以此时相机里的脚本可以访问实例的组件了:
把“this”变为“实例”:
Rigidbody rigidbody = this.GetComponent<Rigidbody>;
↓↓
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>;--------------------------------------B
至此,访问完成。
完成后的代码如下(A+B):
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>;
(写了好长,当初看SIKI老师的教学视频对这里是一知半解,现在加上自己的理解,算是搞明白了逻辑。我总结到的学习方法是初略先过一遍教学视频,再精学,详细记录笔记。)
3.施加力:
这里学习一个新的方法:velocity(速度)(Unity文档:刚体的速度矢量)。
还学习一个:transform.forward(Unity文档:操纵GameObject在世界空间中变换的Z轴(蓝轴)上的位置。与Vector3.forward不同,Transform.forward在考虑其旋转的同时移动GameObject。)
所以总的代码就是:
public GameObject 子弹;
public float speed=30;
void Updatte()
{
if(Input.GetMouseButtonDown(0))
{
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>();
rigidbody.velocity = transform.forward*speed;
}
}