【UnityFPS射击游戏】(2)制作FPS角色控制器方法②
使用CharacterController组件制作Fps角色控制器
2.1鼠标控制视角在X,Y轴旋转
新建FPMouseLook脚本
private Transform cameraTransform; private Vector3 cameraRotation; //保存每一帧存储下的坐标信息public float mouseSesitivity;//修改鼠标灵敏度public Vector2 maxMinAngle;//限制垂直视角区域void Start(){cameraTransform = transform;}void Update(){var mouseX = Input.GetAxis("Mouse X");//将鼠标输入的X值赋予mouseXvar mouseY = Input.GetAxis("Mouse Y"); //将鼠标输入的Y值赋予mouseYcameraRotation.y += mouseX * mouseSesitivity;//Y轴想要旋转需要在X轴移动cameraRotation.x -= mouseY * mouseSesitivity;//X轴想要旋转需要在Y轴移动cameraRotation.x = Mathf.Clamp(cameraRotation.x, maxMinAngle.x, maxMinAngle.y);//cameraRotation.x的值控制在maxMinAngle.x和maxMinAngle.y两个值之间cameraTransform.rotation = Quaternion.Euler(cameraRotation.x, cameraRotation.y, 0);//更新相机的旋转角度
2.2通过控制CharacterController组件,进行移动,跳跃
新建FPCharacterControllerMovement脚本
public class FPCharacterControllerMovement : MonoBehaviour
{private CharacterController characterController; //玩家身上的CharacterController组件private Transform characterTransform;//玩家位置信息private Vector3 movementDirection;public float movementSpeed;//移动速度public float gravity = 9.8f;//重力public float jumpHeight;//角色跳跃高度void Start(){characterController = GetComponent<CharacterController>();//获取组件characterTransform = transform;//获取玩家坐标信息 }void Update(){if (characterController.isGrounded)//CharacterController的isGrounded函数,判断玩家是否处于地面,如果玩家不处于运动状态则不能更改isGrounded的值{var horizontal = Input.GetAxis("Horizontal");var vertical = Input.GetAxis("Vertical");movementDirection = characterTransform.TransformDirection(new Vector3(horizontal, 0, vertical));//移动的方向if (Input.GetButtonDown("Jump"))//当摁下跳跃键,改变玩家的y轴{movementDirection.y = jumpHeight;}}movementDirection.y -= gravity * Time.deltaTime;characterController.Move(movementSpeed * Time.deltaTime * movementDirection);//以自定速度向指定方向移动,不具备重力}
}
2.3完成下蹲,奔跑,行走功能
这里用到了三目运算Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
“?后的是满足前面条件时,:后是不满足时。”
相当于if(KeyCode.LeftShift){runSpeed}else{walkSpeed}
下蹲主要修改玩家身上的Character Controller组件中的Height变量
实现下蹲功能,下蹲行走和奔跑速度的切换。判断是否下蹲,是的话再分别修改其行走和奔跑的速度。
修改FPCharacterControllerMovement脚本
public class FPCharacterControllerMovement : MonoBehaviour
{private CharacterController characterController; //玩家身上的CharacterController组件private Transform characterTransform;//玩家位置信息private Vector3 movementDirection;public float runSpeed;//奔跑速度public float walkSpeed;//行走速度public float gravity = 9.8f;//重力public float jumpHeight;//角色跳跃高度public float crouchHeight;//下蹲的高度private float oldHeight;//原来高度public bool isCrouched;//判断是否蹲下public float crouchRunSpeed;//下蹲奔跑速度public float crouchwalkSpeed;//下蹲行走速度void Start(){characterController = GetComponent<CharacterController>();//获取组件characterTransform = transform;//获取玩家坐标信息 oldHeight = characterController.height;//获取原来高度}void Update(){float currentSpeed = walkSpeed;//声明一个临时变量存储当前速度if (characterController.isGrounded)//CharacterController的isGrounded函数,判断玩家是否处于地面,如果玩家不处于运动状态则不能更改isGrounded的值{var horizontal = Input.GetAxis("Horizontal");var vertical = Input.GetAxis("Vertical");movementDirection = characterTransform.TransformDirection(new Vector3(horizontal, 0, vertical));//移动的方向if (Input.GetButtonDown("Jump"))//当摁下跳跃键,改变玩家的y轴{movementDirection.y = jumpHeight;} if (Input.GetKeyDown(KeyCode.C)){//判断是否蹲下,如果蹲下返回站立高度,如果目前是站立返回下蹲高度,将高度传入协程函数的参数中var currentHight = isCrouched ? oldHeight : crouchHeight;StartCoroutine(DoCrouch(currentHight));//使用协程函数isCrouched = !isCrouched;//将下蹲状态重置为对立状态}if (isCrouched)//{//三目运算符,判断下蹲状态是否摁下LeftShift,是的话执行crouchRunSpeed,否crouchwalkSpeed,赋值给当前速度currentSpeed = Input.GetKey(KeyCode.LeftShift) ? crouchRunSpeed : crouchwalkSpeed;}else{//三目运算符,判断是否摁下LeftShift,是的话执行runSpeed,否walkSpeed,赋值给当前速度currentSpeed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;} }movementDirection.y -= gravity * Time.deltaTime;//重力下落characterController.Move(currentSpeed * Time.deltaTime * movementDirection);//以自定速度向指定方向移动,不具备重力}private IEnumerator DoCrouch(float target)//进行蹲起高度渐变修改的协程函数{while (Mathf.Abs(characterController.height - target) > 0.1f)//当当前角色高度减去1的时候大于0.1执行此代码{float currentHeight = 0;//定义一个高度返回值yield return null;//要记得返回下 不然协程会卡掉characterController.height = Mathf.SmoothDamp(characterController.height, target, ref currentHeight, Time.deltaTime * 5);//渐渐过度效果}}
}
【UnityFPS射击游戏】(2)制作FPS角色控制器方法②相关推荐
- 【UnityFPS射击游戏】(1)制作FPS角色控制器方法①
使用Rigbody&Capsule Collider制作FPS角色控制器 1.1鼠标控制视角在X轴,Y轴旋转 通过鼠标移动视角的代码,此代码放在相机身上 新建[FPMouseLook]脚本 p ...
- 【UE4 第一人称射击游戏】05-设置角色动画
素材资料地址: 链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg 密码:jlhr 效果: 步骤: 1.新建一个名为"Character&q ...
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏①简单制作滚动卷轴以及玩家移动
B站完整视频:[完结]Unity横版卷轴射击游戏制作教程 [满满的全是干货] 独立游戏 | 游戏开发_哔哩哔哩_bilibili➤内容简介 -- Unity游戏制作要领- 从无到有制作一个完整游戏的全 ...
- 【UE4 第一人称射击游戏】18-添加角色换弹时的动作
上一篇: [UE4 第一人称射击游戏]17-重写换弹逻辑 本篇效果: 步骤: 1.打开"SWAT_AnimBP",在动画图表中,添加一个名为"Reloading" ...
- 3dMax游戏建模制作动画技巧、方法总结
基本操作 打开默认动画面板:自定义->显示UI->显示轨迹栏 调整帧的密度:Ctrl + Alt + 鼠标右键 切换线框和实体显示: F3 .增加线框 F4 多选子物体:选中多个根节点后 ...
- unity 3d原创制作射击游戏(全完整版+安卓apk编译)
目录 文章目录 目录 实验一 (1)设计如下UI界面,其中包含了canvas.Panel.Text.Button.Image.RawImage等UI元素 (2)实现点击Play按钮转换场景,点击Exi ...
- unity 3d 原创制作射击游戏(一)
目录 实验一... 4 (1)设计如下UI界面,其中包含了canvas.Panel.Text.Button.Image.RawImage等UI元素... 4 (2)实现点击Play按钮转换场景,点击E ...
- Construct 2制作双人射击游戏概要及感悟
前言 Construct 2是一款图形界面的游戏制作软件.其最大的亮点是用户友好,即不需要掌握编程知识即可轻松制作出生动有趣的小游戏.这里简要介绍如何用Construct 2制作双人射击游戏及制作感悟 ...
- 【UE4 第一人称射击游戏】04-血溅效果
素材资料地址: 链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg 密码:jlhr 效果: 步骤: 1.将图片素材导入UE4 2.创建一个控件蓝图,命 ...
最新文章
- 计算机应用看法,对计算机应用教学方法改革的看法
- 运送超级计算机 蓝书368
- 【Python】推荐20个好用到爆的Pandas函数方法
- html5二次元插件,送你PS一键制作动漫二次元插件,80套背景+50种效果+20款中英字体...
- 剑指offer-斐波那契数列
- php成品代码,PHP代码
- 现代控制会用到python嘛_Python 流程控制
- Hadoop本地运行模式了解~
- 分布式一致性协议:Raft协议
- php mysql切换版本5.7_phpstudy里升级mysql版本到5.7
- JVM内存分配与垃圾回收
- 大数据为什么需要安全分析
- reactinput聚焦事件_React中的事件
- 类似京东商城客户端应用源码
- EasyExcel自适应列宽(官方文档的不好用,个人修改了下)
- php代码生成折现统计图
- ARCGIS中如何把线图层和面图层叠加呢?
- 百度地图API获取某个行政区
- Easier UVM Coding Guidelines / 便捷UVM 编码指南
- CF 3B Lorry