本文已参与「新人创作礼」活动,一起开启掘金创作之路。
接《开始学习第三天》的文章内容,昨天将碰撞检测实现了
那我们今天研究一下实现落在Cube上的时候使Cube停止运动, 那么我们如何在游戏运行的时候取消Cube运动的代码呢?
这是需要用到的代码段,将LeftCube移动到Floor前面
public void OnCollisionEnter(Collision other)
{
//定义一个字符串
string CollisionName;
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//将碰撞体的名字存在字符串中
CollisionName = other.gameObject.name;
//如果碰撞体的名字是LeftCube
if(CollisionName.Equals("LeftCube"))
{
//获取LeftCube身上的LeftCubeMove脚本,并切取消此代码的执行。
other.gameObject.GetComponent<LeftCubeMove>().enabled = false;
}
}
}
再运行游戏,操控上次写的物体,在页面中使Player与LeftCube发生碰撞.
如果你现场运行的话,可以发现
在碰撞的一瞬间,Cube不移动了,并且右边LeftCubeMove的脚本被取消了
但存在一个问题,每次碰撞之前,我们都需要对于名字这个问题来进行一个判断
为了不让每次碰撞,都要判断名字,所以我们需要新建一个命为CubeMove的C#脚本
public class CubeMove : MonoBehaviour {
//定义Cube的初始速度
public float Speed = 1f;
void Start () {
}
void Update () {
//如果脚本所在模型的名字为LeftCube(Clone)或LeftCube
if (this.gameObject.name.Equals("LeftCube(Clone)") || this.gameObject.name.Equals("LeftCube"))
{
//执行移动方法
MoveLeft();
}
if (this.gameObject.name.Equals("RightCube(Clone)") || this.gameObject.name.Equals("RightCube"))
{
MoveRight();
}
if (this.gameObject.name.Equals("StaticCube(Clone)") || this.gameObject.name.Equals("StaticCube"))
{
MoveStop();
}
}
//定义移动方法
void MoveLeft()
{
//使Cube的移动速度递增
Speed += 0.1f;
//移动
this.transform.Translate(Vector3.left * Speed * Time.deltaTime);
}
void MoveRight()
{
Speed += 0.1f;
this.transform.Translate(Vector3.right * Speed * Time.deltaTime);
}
void MoveStop()
{
this.transform.Translate(0,0,0);
}
}
这样,我们所有可经过的Cube就都可以公用一个脚本了。
我们将所有Cube单独控制移动的代码都取消掉,然后将CubeMove的脚本托给所有Cube,别忘了StaticCube也要给。
然后我们修改一下PlayerCollision脚本的代码:
//当进入碰撞器的方法
public void OnCollisionEnter(Collision other)
{
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//取消碰撞体上的CubeMove方法
other.gameObject.GetComponent<CubeMove>().enabled = false;
}
}
这样我们的代码也会变得更加简洁,便于大家理解