天天看点

unity2D学习(6)代码控制角色、摄像机跟随

1 为角色添加代码控制

为Player添加一个New Script(我名命为了PlayerController),就会发现在Assets文件夹下多出了一个C#文件。在Assets下面新建一个Script文件夹方便管理,并把C#文件放入到文件夹里。

unity2D学习(6)代码控制角色、摄像机跟随
unity2D学习(6)代码控制角色、摄像机跟随

2 查看代码控制涉及到input设置

控制角色暂时只涉及到左右移动和跳跃,需要先知道玩家是怎么输入,我们需要调用那些参数。

Edit->Project Settings->Input,然后看见我们要调用的参数Horizontal(水平的)和Jump(跳跃),以及它们的控制按键。

unity2D学习(6)代码控制角色、摄像机跟随
unity2D学习(6)代码控制角色、摄像机跟随

3 编写控制角色代码:左右移动 跳跃

为一开始建立的C#文件进行代码编写,关于里面deltaTime和update的选择,文章最后会做解释。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {
    //左右移动,跳跃
    public float moveSpeed;//移动速度
    public float jumpForce;//跳跃力
    public Rigidbody2D rig;//刚体
    
	// Use this for initialization
    //初始化
	void Start () {
        rig = GetComponent<Rigidbody2D>();//获取主角刚体组件
        jumpForce = 575f;
        moveSpeed = 500f;
	}

    //每帖调用一次更新
    /*void Update () {
        Move();
	}*/

    //固定的时间间隔执行,不受游戏帧率的影响
    void FixedUpdate()
    {
        Move();
    }

    //控制移动
    void Move()
    {
        //当按下你设置的建则返回一个有加速度的值,从1或者-1 过渡到0
        //得到正数对应正半轴,负数对应负半轴的方向
        float moveMultiple = Input.GetAxis("Horizontal");
        //当按下你设置好的键盘就会返回1和-1这两个值
        float faceDirection = Input.GetAxisRaw("Horizontal");
        //角色左右移动
        if (moveMultiple!=0)
        {
            //velocity表示速度,Vector表示向量
            rig.velocity = new Vector2(moveMultiple * moveSpeed * Time.deltaTime, rig.velocity.y);//输入x,y向量,数值*方向
        }
        //角色朝向修改
        if(faceDirection!=0)
        {
            //Scale,代表缩放,Localscale代表的是当前物体相对于父物体的缩放,通过正负不修改大小来实现左右朝向修改
            transform.localScale = new Vector2(faceDirection, 1);
        }
        //角色跳跃
        if (Input.GetButtonDown("Jump"))
        {
            rig.velocity = new Vector2(rig.velocity.x, jumpForce * Time.deltaTime);
        }
    }
}
           

4 摄像机跟随

按照和角色一样的方法,为Main Camera添加Script并编写代码。

让摄像机的位置横纵更新和角色同步就可以了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {
    public Transform player;//角色
	// Use this for initialization
	void Start () {
        player = GameObject.Find("Player").GetComponent<Transform>();//获取角色
	}
	
	// Update is called once per frame
	void Update () {
        transform.position = new Vector3(player.position.x, player.position.y, transform.position.z);
	}
}
           

获取GameObject还可以通过unity拖拽,设置为public的变量可以在unity中可见,例如上面的player,然后直接拖拽。

unity2D学习(6)代码控制角色、摄像机跟随

5 三种update介绍

上面的代码中,我舍弃的了原本的Update函数,使用了FixedUpdate,介绍一下三种update大概就可以知道我为什么选择FixedUpdate。

Update:每一帖调用一次,跟机器的性能有关系,有的性能好的机器帖率高,有的低导致在不同机器上效果不同。

FixedUpdate:固定时间间隔执行一次,一般默认0.02秒执行一次,一秒五十次,默认帖数50帖。可以在Edit->ProjectSetting->time  找到Fixedtimestep修改默认时间间隔。比较适合在物理逻辑和外设操作的处理中使用,GameObject的物理表现的更平滑,更接近现实。

LateUpdate:在所有Update函数调用后被调用,使用例子:角色移动,摄像机后跟随。

6 增量时间(deltaTime)介绍

Time.deltaTime是每帧运行的时间,假设Update是每秒执行N次,帧数为N,则Time.deltaTime = 1/N。这样我们需要每秒移动10米,保证了在不同性能的电脑里面的移动效果都是1秒10米。如果是每一帖移动1米,那么有些电脑的性能好,他一秒可以移动60米,有的电脑差一秒只能移动10米,保证了在在不同电脑上运行的效果一致。