跳跃系统
按空格让玩家跳跃起来
**原理:将刚体y的速度等于跳跃的速度 **
在C#Move脚本里添加代码
(1)先设置跳跃的速度
public float jumpVelocity = 10;//跳跃的速度
(2)让玩家跳起来 将刚体y的速度设置成跳跃的速度即可
velocity.y = jumpVelocity;
rgd.velocity = velocity;
(3)设置if语句 判定玩家按下了空格键
if (Input.GetKeyDown(KeyCode.Space))//如果输入了空格键
{
velocity.y = jumpVelocity;// 将刚体y的速度等于跳跃的速度
rgd.velocity = velocity;
}
至此,保存进入游戏 你会发现玩家可以跳跃了
但是会发现玩家可以无限跳跃 为了游戏的平衡性和合理性 要让玩家到达地面上才可以跳跃
先给地面添加Ground1的标签
然后我们重新回到脚本中设置代码
(1)设置一个布尔值 来判断玩家是否在地面上
public bool isGround = false;//表示它是否在地面上
(2)有了布尔值 就要建立函数来改变它的状态
//判断是否碰到地面,碰到就开启,没碰到就关闭
public void OnCollisionEnter2D(Collision2D col)//设置参数
{
if(col.collider.tag=="Ground1")
{
isGround = true;
}
}
public void OnCollisionExit2D(Collision2D col)
{
if (col.collider.tag == "Ground1")
{
isGround = false;
}
}
注意这里有两个函数 一个是Enter 一个是Exit 就是碰到和离开的意思
(3)状态设置好了 就来重新更改if的条件
if (isGround && Input.GetKeyDown(KeyCode.Space))//如果在地面上并且输入了空格键
{
velocity.y = jumpVelocity;
rgd.velocity = velocity;
}
至此保存游戏 进入游戏就可以发现 只有在碰到地面时才能跳跃
但是会发现因为重力的原因会导致下降很慢
所以要增高rigidbody2D 的Gravity Scale的值
Gravity Scale增高也会使移动变慢
将摩擦力(Friction)调为0
滑行系统
与跳跃系统类似
原理:碰到墙上时降低速度
先添加墙(Wall)的标签
与跳跃的判断方式一样
我们回到脚本里添加代码
(1)设置布尔值 来判断玩家是否在墙面上
public bool isWall = false;//是否在墙上
(2)给OnCollisionEnter2D函数添加新的代码
public void OnCollisionEnter2D(Collision2D col)//设置参数
{
if(col.collider.tag=="Ground1")
{
isGround = true;
rgd.gravityScale = 2;
}
if (col.collider.tag == "Wall1")//如果碰到墙面时
{
isWall = true;//状态打开
rgd.velocity = Vector2.zero;//速度等于0
rgd.gravityScale = 1;//下降重力降低 让玩家减速下降
wallTrans = col.collider.transform;//保存,记录这个墙的坐标
}
public void OnCollisionExit2D(Collision2D col)
{
if (col.collider.tag == "Ground1")
{
isGround = false;
}
if (col.collider.tag == "Wall1")
{
isWall = false;//关闭这个状态
rgd.gravityScale = 2;//将下降重力调回原速
}
至此就完成了 但是需要动画才能体现效果
所以我们要开始添加动画系统
动画系统2
先在变量这里添加布尔值 用来判断是否碰到墙壁与地面
要让这个状态能跟随脚本里的状态 需要在脚本里添加代码
private Animator anim;//获取动画组件
private void Awake()
{
anim = this.GetComponent<Animator>();
}
public void OnCollisionEnter2D(Collision2D col)
{
anim.SetBool("isGround", isGround);//让unity里的isGround的bool跟随这脚本里的isGround
anim.SetBool("isWall", isWall);
}
public void OnCollisionExit2D(Collision2D col)
{
anim.SetBool("isGround", isGround);
anim.SetBool("isWall", isWall);
}
这样状态就能实时跟随了
然后依据着这些变量 给每个状态添加判断值 来让它自动转换动画
滑行时调整正确朝向
设置好了滑行的动画状态 我们跳跃到墙上的时候会发现这种情况
这是因为 我们没有调碰到墙壁时的朝向
在脚本里添加函数
public void ChangeDir()
{
isSlide = true;
if (wallTrans.position.x < transform.position.x)//如果碰到墙的x坐标小于玩家的x坐标,就说明墙在左边
{
transform.localScale = new Vector3(1, 1, 1);//玩家朝向右
}
else
{
transform.localScale = new Vector3(-1, 1, 1);//朝向左
}
}
添加完以后就完成了
相机跟随
原理:建立一个目标跟随他的X值
新建一个脚本
(1)建立一个目标 用来跟随
public Transform target;
(2)得到当前坐标
Vector3 pos = transform.position;
(3) 因为我们是横向移动视角的,所以只跟随x值就好了
pos.x = target.position.x;
(4)把值复制给我们的transfrom.position
transform.position = pos;
将这些代码放入到脚本中 ctrl+s保存后 将脚本放入到main camera
再在main camear的面板中Target的目标选player
因为我们在脚本中新建了一个目标 transfrom可以延伸到unity界面选取目标
选好后再启动游戏会发现视角跟着玩家移动了