–整理0404
1.安装环境:
Visual Studio2013
Unity5.6.1f1
实现角色移动与跳跃
**
一、准备工作:
**
(1)创建一个场景S003:在Hierarchy面板中写入LocalManager文件,写入ResourcesManager与CanvasManager.分别挂上LoadRes脚本与CanvasManagerEX脚本。(此步之前笔记讲过,用来管理资源与Canvas)
(2)加入所用资源:Image->Resources->图片003
(3)创建人物Player:在Canvas下创建,UI->Image。将图片资源拖入后,创建预制体Player。(将Canvas下的Player拖入PreFab的Resources中)
二、.编写控制人物移动的脚本:MoveControl.C#
通过调整Transform组件的属性实现游戏对象的移动。以下是需要了解的几个函数与结构体。
(1)Translate函数
Translate函数用于处理游戏对象移动。
this.Translate(移动方向 * 速度 * 前进/后退方向 * Time.deltaTime, 基准坐标系);
1)Time.deltaTime表示前一帧到当前帧或非的时间,
2)使用Transform组件 ,游戏对象移动的逻辑必须乘以deltaTime,使游戏对象的移动速度不受帧率的影响,而根据某个固定的速度移动。
3)乘以Time.deltaTime,游戏对象将以每秒1各单位的速度前进)
4)将向量单位乘以速度(speed),表示按照speed变量指定的速度移动。
(2)Vector3(x, y, z)是unity提供的用于保存三维坐标值和向量数据的结构体。
(3)键盘的输入:GetKey(用户长按按键有效),GetKeyDown(用户按下按键时有效),GetKeyUp(用户抬起按键时有效)三个方法分别获取用户键盘按键的输入
以下是控制移动的代码。
if (Input.GetKeyDown(KeyCode.Space))
{
frameTime = 0;
isJump = true;
}
else if (Input.GetKey(KeyCode.S))
{
print("move s");
this.transform.Translate(Vector3.back * Time.deltaTime * speed);
}
else if (Input.GetKey(KeyCode.A))
{
print("move a");
this.transform.Translate(Vector3.left * Time.deltaTime * speed);
}
else if (Input.GetKey(KeyCode.D))
{
print("move d");
this.transform.Translate(Vector3.right * Time.deltaTime * speed);
}
其中,控制角色跳跃,需要利用弹道/抛物线s=ut+1/2at²。当按下空格键时,角色跳跃呈开口向下的抛物线,至最高点后下落,返回至地面。在跳跃过程中,设生命线为frameTime。设抛物线的两个零点是0与0.6,也就是跳跃过程的生命线应小于0.6。在跳跃过程中,角色y值发生改变。由函数getY()得到y的变化值与返回布尔类型的isEnd。
float a = 18.5f;
float h = 6.66f;
bool isJump = false;
public float getY(float t, out bool isEnd)
{
if (t < 0.6)
{
isEnd = false;
}
else
{
isEnd = true;
}
if (t > 0.6)
{
return 0;
}
//带入两个零点解方程,计算出a,h的值
float y = 0.45f - 5 * (t - 0.3f) * (t - 0.3f);
return y;
}
在Start()中定义isJump 判断是否跳跃,并存贮初始y值。
isJump = false;
initposy = this.transform.position.y;
//将初始y值存储起来
在定义跳跃的代码中,初始frameTime = 0; isJump = true;
当 isJump = true;开始跳跃过程,实时时间frameTime+= Time.deltaTime;当frameTime>0.6,生命线结束,isEnd=true;
当getY()返回isEnd为true时,表示frameTime>0.6,跳跃过程结束。
if (isJump == true)
{
frameTime += Time.deltaTime;
//生命线frameTime
if (frameTime > 0.6f)
{
isEnd = true;
}
float y = getY(frameTime, out isEnd);
this.transform.position = (new Vector3(this.transform.position.x, y * 100 + initposy, this.transform.position.z));
if (isEnd == true)
{
isJump = false;
}
Debug.Log(y);
}
定义子弹发射,当按下k键时,发射子弹。其实就是按下k键,生成一个GameObject子弹对象。并定义生成后的位置。
此处,通过字典查找资源boom。
if (Input.GetKeyDown(KeyCode.K))
{
Debug.Log("按下了K");
GameObject g = GameObject.Instantiate(LoadRes.getPrefab(ResName.boom
), CanvasManagerEX.canvas1.transform);
//生成后重新定义位置
g.GetComponent<RectTransform>().localPosition = this.GetComponent<RectTransform>().localPosition;
}
定义预制体字典prefabDic:
1.生成字典prefabDic
//****1.生成字典prefabDic****
static Dictionary<string, GameObject> prefabDic = new Dictionary<string, GameObject