首先,我们创建一个新场景。
我们需要实现的效果就是移动该小球,移动操作需要借助脚本实现。
我们创建一个Move脚本,同时将其附加给小球。同时移动操作,需要借助刚体组件实现,所以我们还需要创建一个刚体组件,将该刚体附加给小球。
实现上述步骤以后,我们开始编写脚本。
由于移动小球需要借助刚体组件,所以我们第一步是获取刚体组件,并且对刚体组件进行赋值操作,最后只需要给刚体组件施加一个力即可。
public class Move : MonoBehaviour {
//定义一个刚体对象
private Rigidbody rb;
void Start () {
//接收刚体组件
rb = GetComponent<Rigidbody>();
}
void Update () {
//添加一个力,Vector3为一个三维向量,参数分别为x,y,z,当x = 1时,表示当前x方向发生偏移
rb.AddForce(new Vector3(1, 0, 0));
}
}
我们运行后发现其只能在一个固定的方向运动,有没有能够根据按键控制运动呢?
我们需要在Update中引入Input进行判断。
void Update () {
//Input.GetAxis用于检测是否按下键盘按键
//Horizontal表示水平按键
float h = Input.GetAxis("Horizontal");
//Vertical表示垂直按键
float v = Input.GetAxis("Vertical");
//添加一个力
rb.AddForce(new Vector3(h, 0, v));
}
但是我们发现小球移动的速度特别慢。我们只需要定义一个参数即可。
public class Move : MonoBehaviour {
//定义一个刚体对象
private Rigidbody rb;
//定义小球移动的速度
public int speed = 5;
// Use this for initialization
void Start () {
//接收刚体组件
rb = GetComponent<Rigidbody>();
}
void Update () {
//Input.GetAxis用于检测是否按下键盘按键
//Horizontal表示水平按键
float h = Input.GetAxis("Horizontal");
//Vertical表示垂直按键
float v = Input.GetAxis("Vertical");
//添加一个力
rb.AddForce(new Vector3(1, 0, 0) * speed);
}
}
为什么需要将speed设置为一个共有的变量呢?
后期我们只需要在这里设置小球移动的速度即可,不需要再脚本中设置。
我们控制了小球发生移动,但是小球会消失再摄像机的视角范围内,如果需要小球一直在视野范围内,则需要通过脚本设置摄像机的移动即可。(即摄像机于小球的相对距离不变)
我们创建一个FollowMove脚本,同时申请一个transform组件。
将该脚本赋值给主摄像机,由于我们transform组件设置为共有的,所以我们可以在外部对其进行赋值,我们将小球赋值给它。
public class FollowMove : MonoBehaviour {
public Transform SphereTransform;
//设置一个距离的三维变量,用于保存摄像机于小球之间的距离。
private Vector3 distance;
// Use this for initialization
void Start () {
//由于当前脚本添加到主摄像机上,所以transform.position表示主摄像机的位置
//由于我们给SphereTransform赋值为小球,所以SphereTransform.position为小球的位置
distance = transform.position - SphereTransform.position;
}
// Update is called once per frame
void Update () {
//主摄像机的位置为每次小球移动的位置+之间的距离
transform.position = SphereTransform.position + distance;
}
}