游戏思路:
1.摄像机跟随的第一人称类型游戏
2.游戏可依靠Unity内置功能去实现
3.游戏主要包含:玩家部分、敌人部分、UI部分、粒子系统、音频管理、敌人AI、敌人生产
4.该游戏属于入门级FPS案例,留下众多可拓展部分,可细细道来
而作为第一人称射击游戏,首先动刀子一定是我们的英雄了
在这里先去完成英雄的移动脚本 MyPlayerMove : MonoBehaviour
public float mMoveSpeed = 5f; //移动速度
Vector3 movement; //移动变量
Rigidbody mRigidbody;
Animator animator;
int layerMask; //射击对象蒙版层
float range = 100; //子弹最大射程
private void Awake()
{
mRigidbody = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
layerMask = LayerMask.GetMask("Floor"); //取到Layer标签为Floor层的索引
}
此脚本核心业务逻辑部分如下:
private void FixedUpdate()
{
var h = Input.GetAxisRaw("Horizontal"); //水平偏移量--映射W、S,Up、Down
var v = Input.GetAxisRaw("Vertical"); //垂直偏移量--同理
Move(h, v); //英雄移动
Truning(); //转弯
Animation(h, v); //动画
}
Move函数主要负责对英雄移动的控制,具体实现如下:
private void Move(float h, float v)
{
movement.Set(h, 0, v); //偏移变量设置初始值
movement = movement * mMoveSpeed * Time.deltaTime; //当前位置的偏移量
mRigidbody.MovePosition(transform.position + movement); //更新英雄位置
}
定义在Rigidbody下的公共方法MovePosition ,接受3维向量作为参数,移动到此3维向量所在位置
Truning函数负责完成英雄的旋转,具体实现如下:
private void Truning()
{
Ray _ray = Camera.main.ScreenPointToRay(Input.mousePosition); //射线检测
RaycastHit _rh;
if (Physics.Raycast(_ray, out _rh, range, layerMask))
{
var lookView = _rh.point - transform.position; //英雄位置指向碰撞点的向量LV
lookView.y = 0f; //忽略y轴间的差值
var newRotation = Quaternion.LookRotation(lookView); //英雄当前方向到向量LV方向需要旋转的四元数
mRigidbody.MoveRotation(newRotation); //转向
}
}
定义在Rigidbody下的公共方法MoveRotation,接受旋转到目标方向的四元数,得到旋转后新的方向
英雄移动动画实现较为简单,直接贴出代码吧
private void Animation(float h, float v)
{
var walking = h != 0 || v != 0; //这是一个简单bool表达式,只有h、v中有一个不为0,表示正在移动,此时设置移动动画
animator.SetBool("IsWalking",walking);
}
对英雄移动的代码先写这么多,后面继续贴出英雄生命值、英雄射击,两篇脚本
--------------这个游戏在以前刚刚学习Unity时,总是问题不断,在有一定基础之后我希望可以依据这个官方案例使自己的能力有所提升。
以后该认认真真写好博客了。。。