1 为角色添加代码控制
为Player添加一个New Script(我名命为了PlayerController),就会发现在Assets文件夹下多出了一个C#文件。在Assets下面新建一个Script文件夹方便管理,并把C#文件放入到文件夹里。
2 查看代码控制涉及到input设置
控制角色暂时只涉及到左右移动和跳跃,需要先知道玩家是怎么输入,我们需要调用那些参数。
Edit->Project Settings->Input,然后看见我们要调用的参数Horizontal(水平的)和Jump(跳跃),以及它们的控制按键。
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,然后直接拖拽。
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米,保证了在在不同电脑上运行的效果一致。