Unity通过键盘按键控制小球移动

首先,我们创建一个新场景。
在这里插入图片描述
我们需要实现的效果就是移动该小球,移动操作需要借助脚本实现。
在这里插入图片描述
我们创建一个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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42708024/article/details/106577601