网站建设对产品推销作用大吗,wordpress网頁,域名网站电话,电商平台是什么意思前言#xff1a;上一篇的时候#xff0c;我们已经导入了官方fps的素材#xff0c;并且对三维模型有了一定了解。接下来我们要构建一个简单的场景让玩家能够有地方移动#xff0c;然后写一个简单的玩家移动控制。 简单场景和玩家移动 简单场景玩家移动控制玩家模型视野-摄像…前言上一篇的时候我们已经导入了官方fps的素材并且对三维模型有了一定了解。接下来我们要构建一个简单的场景让玩家能够有地方移动然后写一个简单的玩家移动控制。 简单场景和玩家移动 简单场景玩家移动控制玩家模型视野-摄像机挂载武器-武器挂载和材质玩家控制-CharacterController玩家控制-移动脚本运行效果 补充知识时间增量按键输入 简单场景
如果没有素材的时候我们可以右键添加Plane但是这种地图没有什么设计感没有材质贴图啥的。
我们可以从素材中找到地图预制体搜索Floor就会看到很多Floor地板场景素材我选了Floor9×9。
玩家移动控制
玩家模型
回到官方fps游戏演示中玩家第一人称其实是没有模型的只显示了武器。但是有一些fps游戏中会有模型就是会只显示手的模型只不过在官方fps素材中没有。
所以我们玩家并不需要拉一个模型进来。
先创建一个空的GameObject命名为玩家。
视野-摄像机挂载
视野其实就是主摄像机看到的内容要和玩家的移动同步所以主摄像机应该挂载在玩家的节点下面。 挂载后视野就会随着Player移动和转向。
武器-武器挂载和材质
武器也要挂载在玩家的节点下因为武器也会跟随玩家一起移动在Player下面新建Weapon空GameObject用来后续挂载武器预制体。
武器的素材在fps官方素材包都有可以在以下路径找到武器模型。 把其中一个模型放入到Weapon节点下面然后右键prefabs-unpack一下免得操作影响到素材本身的预制体。 可以发现武器是没有材质的去素材找到对应贴图“WeaponPistol”绑定到模型中。全选左边所有的GameObject然后拖拽材质到右边的Element0中。 调整Weapon节点位置让武器出现在主视角中比较合理的部分。
玩家控制-CharacterController
首先先为我们玩家控制选择合适的方式
玩家控制常用有三种方式分别是Tranform Translate、Rigid BodyCapsule和CharacterController。
Tranform Translate就是调整物体位置属性可以随便移动但是不会产生碰撞。会鬼穿墙不适合我们游戏的需求因为fps不能穿墙。
Rigid BodyCapsule符合物理学可以和Physics Object交互。但是物体之间会有物理碰撞施加力的作用就是玩家可以撞开敌人这个也不太复合我的需求。
CharacterController可以有碰撞但是不会力的作用无法和Physics Object交互提供了大量API。 符合我们fps操作需求。
添加和调整CharacterController组件 为Player添加CharacterController组件。
调整CharacterController胶囊碰撞体调整到自己认为合适。
玩家控制-移动脚本
添加和编写脚本 在自己项目代码文件夹下新建一个C#文件命名为PlayerController并挂载到Player中。 打开PlayerController代码会默认生成两个函数Start和UpdateStart可以用来放一些初始化的数据只会在开始调用一次Update则是每帧都会调用。
先从简单的控制功能开始让角色能够跟着键盘输入进行前后左右的移动。
代码思路很简单先获取CharacterController组件和键盘输入通过键盘数据来调用CharacterController组件的API控制角色移动。
具体代码如下
public class PlayerController : MonoBehaviour
{public CharacterController m_Controller;public float speed 6.0F;void Start(){m_Controller this.GetComponentCharacterController();}void Update(){PlayerMovement();}// 控制角色移动public void PlayerMovement(){// CharacertController的Move函数需要输入一个三维的向量// 每个分量表示三维不同方向前进多少Vector3 moveDirection Vector3.zero;// 获取键盘输入// Horizontal左右移动Vertical前后移动moveDirection new Vector3(Input.GetAxis(Horizontal), 0, Input.GetAxis(Vertical));m_Controller.Move(moveDirection * Time.deltaTime*speed);}
}把CharacterController组件拖拽到控制代码组件中。
运行效果 补充知识
代码思路虽然说的很清楚但是有一些小细节可能会有些不懂补充一些相关知识能理解的更加透彻。
时间增量
会发现玩家控制代码中移动的距离乘上了deltaTime时间增量。
这是因为Update更新是每帧更新一次。
假设说我们帧率是60fps每次时间增量就是1/60 秒。 游戏设定按下按键后1秒移动10米那么每帧刷新的时候距离就要乘上1/60 也就是时间增量。 可以确保不同帧率下速度一致。
按键输入
不同键盘输入的获取可以通过菜单-Edit-Project Settings查看。 左右对应的是“Horizontal”前后对应的是“Vertical”。 也可以修改对应键位。