作者:Yumir
哈喽大家好我是yumir。
最近沉迷元气骑士,自从官方把各种“bug”修复之后,这个游戏对我这种手残玩家来说实在是太难了。既然打不过,那我就自己写一个,不就是俯视角射击吗,分分钟给你搞定,一百行代码都不要。
要说用unity实现俯视角射击是一种怎样的体验,就是太简单了,要加上元气骑士,就不简单了。所以这次只是实现角色控制和手枪射击,总之“俯视角”和“射击”都有啦,也是个俯视角射击游戏了嘛。
具体步骤如下:
实现效果
实现角色移动首先要有角色,虽然用方块就可以,但是这样就会显得没有诚意,为了更加有诚意一点我用之前学到的2D绑骨知识做了角色闲置和走路两个动画,这样角色移动的时候就不是平移的,而且还很省时省力【机灵】。
元气骑士是手游,角色移动是通过屏幕上的摇杆来控制的,现在在电脑上模拟游戏效果直接使用“WASD”来代替,摇杆也比较简单,下载一个easy touch插件就可以搞定了。
首先需要给角色预制体挂载控制脚本以及碰撞器和刚体组件,调节碰撞器的大小并将刚体的重力设置为零。
在Update中获取键盘输入的"Horizontal"和"Vertical"的值,这两个值分别代表”A、D“和”W、S“的按下,正好形成一个二维坐标,可以用来计算移动的目标点。
movement.x = Input.GetAxis("Horizontal");movement.y = Input.GetAxis("Vertical");
在FixedUpdate中更新角色的下一个位置,也就是将上面的movement和角色当前位置相加。
rg.Moveposition(rg.position movement * moveSpeed * Time.fixedDeltaTime);
这样一来角色就可以像这样傻fufu的在地图里乱窜了。
让角色动起来
在角色身上添加一个Animator组件,并新建一个动画状态机,用骨骼动画的方法制作一个”点头“动画和一个”走路“动画,添加转换条件”walk“。
在角色的管理脚本中通过判断movement的值对walk的值进行修改,角色移动的动画就设置完毕了。
if (movement == new Vector2(0, 0))
{
playerAnima.SetBool("walk", false);
}
else
{
playerAnima.SetBool("walk", true);
}
虽然这实际上是一个只有一面的角色,但是还是要营造出一种角色和手上的枪都是跟着鼠标走的错觉,首先需要让枪转向鼠标的方向,再来实现角色转向鼠标的效果。
枪转向鼠标比较简单,将鼠标位置和枪的位置的差归一化,其结果就是枪指向的方向,我的枪口正好是”枪“的右方,所以直接对枪的右方进行赋值。
Vector2 lookDir = target - (Vector2)weaponTrans.position;
lookDir = lookDir.normalized;
weaponTrans.right = lookDir;
角色转向鼠标的效果稍微复杂,首先我的角色预制体的内部层级是这样的:
之所以这样设计是因为枪的后坐力动画必须这样实现,如果要进一步增加游戏体量也需要将武器独立设计,也就是在左右翻转的时候我分别需要翻转角色的身体和持有的武器,武器需要变换位置。
if (rg.position.x > target.x)
{
body.flipX = true;
weaponTrans.GetComponentInChildren<SpriteRenderer>().flipY = true;
weaponTrans.position = p2.position;
}
else if (rg.position.x < target.x)
{
body.flipX = false;
weaponTrans.GetComponentInChildren<SpriteRenderer>().flipY = false;
weaponTrans.position = p1.position;
}
看向鼠标
准星射击
前面预制体层级里面可以看到我已经在预制体里面设置好了发射子弹的位置,只需要生成子弹之后让子弹向着枪口的方向飞出去就可以了。
我在脚本中声明了一个用来控制准星大小的变量,生成子弹的时候在枪的角度的基础上加上抖动角度。再给角色一个向右边(子弹的前方)的爆发力,就可以实现射击的效果了。
GameObject bullet = Instantiate(bulletPrefab, PlayerControl.instance.firePoint.position, PlayerControl.instance.firePoint.rotation * Quaternion.AngleAxis(Random.Range(0, sight), Vector3.forward));
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.right* bulletForce, ForceMode2D.Impulse);
为了使射击的效果更好一点,我加了特效动画,首先是射击时枪后座动画和射击喷火的动画在射击的时候触发播放,我的状态机是这样设计的:
在脚本中通过Animator.Play(状态名)调用。
子弹的碰撞触发是写在子弹预制体的脚本上的,当子弹发生碰撞时销毁自身并生成一个特效物体(该物体的动画最后一帧销毁自身)。
由于子弹飞出可能会碰到角色的碰撞器,所以需要判断碰撞到的物体的Tag标签再进行判断,注意子弹要勾选Trigger,不然会把玩家角色碰开。
public class Bullet : MonoBehaviour{
public GameObject hitEffect;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.transform.tag != "Player")
{
Instantiate(hitEffect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
}}
最后我增加了一个简单的镜头跟随,就是文章开头的效果啦,元气里的镜头是受摇杆影响的,有时间也来研究一下吧。因为Github上传不稳定所以以后都导包出来放网盘啦。
https://pan.baidu.com/s/1OREQu6OK0UPVe38Jr-Zb6w
欢迎加入游戏开发群欢乐搅基:869551769
有意向参与线下游戏开发学习的读者可戳这里进一步了解:http://www.levelpp.com/
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved