刚开始学习unity的时候很容易对众多的API搞糊涂,特别是博客里很多博主的写作思路十分混乱,完全不能看懂,看了书之后感觉清晰了很多,总结一下。

如果你还分不清世界坐标系和Self坐标系,建议先去看下基础,

基础的unity入门 先推荐一个博主,讲得深入浅出,很清晰详细:Unity基础:非常基础的Unity入门

先放第一人称视角实现的整体的代码,
绑定脚本在作用物体上:

实现效果:

(虽然希望录多一点,但是由于图片大小限制,只能这样,,,)可以在Scene里看到,没有限制四周的方向,限制了上下的视野。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MouseLook : MonoBehaviour
{//注意枚举的使用,可以用名称设置值,而不是用魔术数字,这样有利于代码的理解和阅读,是良好的习惯public enum RotationAxes{MouseXAndY = 0,MouseX = 1,MouseY = 2}public float sensitivityHor = 9.0f;//水平旋转速度public float sensitivityVert = 9.0f; //垂直旋转速度,灵敏度public float minimumVert = -45.0f;public float maximumVert = 45.0f;private float _rotationX = 0;//为垂直角度声明一个变量public RotationAxes axes = RotationAxes.MouseXAndY; //使得变量暴露在组件里,可以在Unity里可视化更改// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if(axes == RotationAxes.MouseX){transform.Rotate(0,Input.GetAxis("Mouse X") * sensitivityHor, 0);//水平旋转,所以固定了z轴,绕着z轴在四周旋转。}else if (axes == RotationAxes.MouseY){   //垂直方向旋转的代码_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert; //基于鼠标增加垂直角度_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert); //限制上下看的范围float rotationY = transform.localEulerAngles.y;//保持y的角度transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0); //使用新的值存储固定了的旋转前的水平旋转信息并增加上下方向旋转的移动}else{// 同时可以水平和垂直方向的旋转_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);float delta = Input.GetAxis("Mouse X") * sensitivityHor; //delta是旋转的变化量,一般数学上也会把变化量协作deltafloat rotationY = transform.localEulerAngles.y+ delta;transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);}}
}

第一人称视角的编写,也就是所谓的MouseLook(视野跟着鼠标的方向移动)首先要理清旋转的概念。
例如:下面这个略倾斜的立方体(略倾斜是为了使得世界World坐标系和自身sELF坐标系不一样)

transform.Rotate(speed, 0, 0,Space.Self);
transform.Rotate(speed, 0, 0,Space.World);

1.沿着World坐标旋转时,是沿着世界坐标系(右上角的那个坐标)在旋转,整体的旋转方向垂直于屏幕

2,沿着Self坐标旋转时,可以看出,是沿着自身的x轴在旋转,红色的轴没有变动,

Rotate的含义和使用情况:

Rotate()的实际含义是 ”增加当前的旋转“,由于在水平方向的旋转我们的确需要增加就行了,所以可以用Rotate,
而我们的垂直方向的旋转需要限制旋转的范围,
所以,显然Rotate就不合适了,因为即使限制了旋转的增加的幅度,,也会导致角度的增加,

这样会发生什么呢?(思考)

会导致莫名奇妙的翻车

所以受限制的垂直方向上的旋转需要使用其他的方法”——写死增加的值,固定住需要旋转的角度的幅度。

Rotate可以理解为增加transform.localEulerAngles可以理解为设置角度为XX度。

1.利用Input.GetAxis("Mouse Y")来获取在垂直方向上的鼠标的位移,乘上一个灵敏度,免得过度灵敏,
得到的这个角度只是一个固定值,但是还没有和原有角度组合应用,所以需要将过去的值减去变化值 --->当前值

private float _rotationX = 0;//为垂直角度声明一个变量_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert; //基于鼠标增加垂直角度_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert); //限制上下看的范围,Math.Clamp限制了取值范围,防止了过度旋转,

2.然后获取当前的y轴的角度,因为在进行受限制的垂直视角变换时,其实水平方向上是不变的,所以需要写死增加的值,固定住需要旋转的角度的幅度的时候,水平角度固定住。

float rotationY = transform.localEulerAngles.y;//获取y的角度
transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0); //使用新的值存储固定了的旋转前的水平旋转信息并增加上下方向旋转的移动

3.最后,结合水平方向上无限制和垂直方向上受到限制的控制和变化,
利用 transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);来自己定义角度变化,
注意,由于垂直角度被限制了,导致了水平旋转也不能用Rotate去增加了(因为最后都必须用transform.localEulerAngles来进行设置),所以只能老实地求值了。

// 同时可以水平和垂直方向的旋转
_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);float delta = Input.GetAxis("Mouse X") * sensitivityHor; //delta是旋转的变化量,一般数学上也会把变化量协作delta
float rotationY = transform.localEulerAngles.y+ delta;
transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);

注意的一些:

1.我们需要创建新的Vector3, 而不是修改Transform已经存在的值,因为transform里的值是只读的,这是常犯的错误。
2.记住。Rotate是增加角度!!
3.对玩家进行禁止物理旋转: 当玩家是刚体,和其他碰撞体进行接触时,轻微的碰撞也会导致玩家被反弹,跌倒等等,这种碰撞的行为显然不符合预期(我们假设人是柔软的),
所以我们需要加入:

   void Start(){//.....其他代码Rigidbody body = GetComponent<Rigidbody>();if(body!= null){body.freezeRotation = true; //设置物理旋转无效。}//...其他代码}

【unity】游戏的第一人称编写,限制角色视野范围,unity的Rotate使用情况区分一次搞懂相关推荐

  1. 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    文章目录 一.前言 二.实现方案 1.无主之地,第一人称视角 2.我之前做的摇杆控制 3.第一人称视角 + 摇杆控制 三.开始实战 1.资源获取:Unity AssetStore 2.Low Poly ...

  2. 项目实训(十一)——FPS游戏(第一人称射击游戏)初步开发

    一.前言 我与另外两个组员合作进行了FPS游戏(第一人称射击游戏)的开发,这个游戏对应于我们在项目开始设想的PVP玩家对战游戏.玩家之间的之间对战会让游戏变得更加紧张刺激,还能够增强玩家之间的感情. ...

  3. fps射击HTML网页游戏,关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 FPS第一人称射击类游戏实例 场景搭建 1.创建Unity项目工程和文件目录,保存场景 2.导入人物模型和子弹碎片的资源包charact ...

  4. 关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪; 2: 导入碎片模型; 3: 创建一个平面; 4: 创建一个障碍物; 5: 导入人物模型; ...

  5. unity实现坦克第一人称视角移动 鼠标发射,位置改变

    Holle 好久没更新了,实在想不到更新啥了,就更新下最近痴迷的unity吧. 分为四个板块,实现第三人称视角,上下左右移动,鼠标进行发射炮弹,鼠标改变移动方向 我们的需要准备的工作有:unity 自 ...

  6. 游戏分为第一人称和第三人称,什么是第二人称

    第一人称 第三人称 第二人称 最简单实现第二人称的方式,和朋友打cs单挑,然后将显示器连接线交换. 第一人称是自己,第三人称是除自己和对方的旁观者视角,那第二人称就是站在你对面的视角,举个例子,你正在 ...

  7. unity游戏开发毕设_毕设分享:用 Unity 探究 2D 游戏的打击感

    这是我毕业设计的一部分 emmm--我的毕设和格斗游戏相关,而对于打击感的研究算是其中我比较在意的一环.现在临近毕业,我将毕设中开发部分的一些内容整理出来分享,希望能通过这样学习到更多的东西. 打击感 ...

  8. Unity 如何实现第一人称射击游戏(吃鸡游戏)

    关键代码截图: 方向向量决定 FR:海涛高软(HUNK Xu) QQ技术交流群:386476712

  9. 一个可以进行第三人称与第一人称切换的角色控制器,

    Git下载地址 我暂时没有学会如何上传到Github,学会我再上传 CSDN下载地址 https://download.csdn.net/download/GoodCooking/86400040 请 ...

最新文章

  1. .ipynb文件转.py文件
  2. JDk8的新特性-流和内部iteration
  3. Python3 文件的重命名
  4. Winform判断一个窗口是否以模态化方式打开
  5. 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律
  6. GDCM:压缩DICOM影像文件的测试程序
  7. jzoj1213-棋盘上的士兵【状压dp】
  8. “约见”面试官系列之常见面试题第三十三篇之事件委托(建议收藏)
  9. bat脚本中如何多次键盘输入并判断_电脑上如何多开微信?PC端多开微信的方法
  10. GP学习整理(一)—Geoprocessing assembly and Geoprocessor managed assembly
  11. linux无法将文件移入回收站,linux中使用rm命令将文件移到回收站的方法
  12. spring容器的懒加载
  13. 亚信基于AWS构建世界级企业互联网平台
  14. eclipse中常见快捷键
  15. java 文本词频统计_Java实现中文词频统计
  16. 冒泡排序算法详解之C语言版
  17. 软件设计文档示例模板 - 学习/实践
  18. 【新品发布】行业领先数据恢复“先锋”震撼来袭
  19. 50个最新漂亮的国外网站模板下载
  20. android 获取收到短信验证码,Android自动获取短信验证码

热门文章

  1. 是谁说的测试工资高的,应届毕业生,面试测试岗5k薪资都没人要.....
  2. centos8安装及配置nfs4
  3. Small Object Detection using Context and Attention
  4. 【学习笔记】SpringMVC—@RequestMapping注解
  5. 混合动力汽车SIMULINK整车模型,并联P2构型,基于规则的控制策略,模型运行及仿真无误
  6. miix5 u盘安装linux,联想Miix510U盘装系统win10教程
  7. 04-C语言如何返回两个甚至多个值?
  8. Leetcode_584. 寻找用户推荐人
  9. Istio Ambient Mesh 介绍
  10. UE4-灯光烘焙效果质量不佳解决方法