视频教程:https://www.bilibili.com/video/BV12s411g7gU?p=149

目录

键盘输入

InputManager


键盘输入

当通过名称指定的按键被用户按住时返回true:

bool result=Input.GetKey(KeyCode.A);

当用户按下指定名称按键时的那一帧返回true:

bool result=Input. GetKeyDown(KeyCode.A);

在用户释放给定名称按键的那一帧返回true:

bool result=Input. GetKeyUp(KeyCode.A); 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class InputDemo: MonoBehaviour
{public bool isDown;void Update(){isDown = Input.GetMouseButton(0); //检测按下C键同时按下D键if (Input.GetKey(KeyCode.C) && Input.GetKey(KeyCode.D)){print("同时按下C、D键");}}
}

ps:KeyCode本质上是一个枚举类

瞄准镜

通过鼠标右键,实现摄像机镜头缩放

将以下脚本挂载至模板场景中自动创建的Main Camera(如没有就创建一个带有Camera组件的空物体),将Camera组件的Field of View属性设置为60,作为未缩放时的默认值

1.单倍缩放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraZoom : MonoBehaviour
{new private Camera camera;private bool isZoom = false;void Start(){camera = GetComponent<Camera>();}void Update(){if (Input.GetMouseButtonDown(1)){isZoom = !isZoom;}if (isZoom){camera.fieldOfView=Mathf.Lerp(camera.fieldOfView,20,0.1f);if(Mathf.Abs(camera.fieldOfView-20)<0.1f)camera.fieldOfView=20;}else{camera.fieldOfView=Mathf.Lerp(camera.fieldOfView,60,0.1f);if(Mathf.Abs(camera.fieldOfView-60)<0.1f)camera.fieldOfView=60;}}
}

未缩放:

缩放后:

2.多倍缩放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraZoom : MonoBehaviour
{new private Camera camera;public float[] zoomLevel;private int index = 0;void Start(){camera = GetComponent<Camera>();}void Update(){if (Input.GetMouseButtonDown(1)){// index = index < zoomLevel.Length - 1 ? ++index : 0;index = (++index) % zoomLevel.Length;}camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, zoomLevel[index], 0.1f);if (Mathf.Abs(camera.fieldOfView - zoomLevel[index]) < 0.1f)camera.fieldOfView = zoomLevel[index];}
}

Mathf.Lerp(float a, float b, float t):在a与b之间按t进行线性插值

a 起点值
b 终点值
t 两个浮点数之间的插值

当t=0时,返回a;当t=1时,返回b;当t=0.5时,返回a和b的中点

代码中的

index = index < zoomLevel.Length - 1 ? ++index : 0;

等同于

index = (++index) % zoomLevel.Length;

但后者采用的是数据结构中循环队列的思想

参数设置

未缩放:

1级缩放:

2级缩放

InputManager

即输入管理器,位于Edit-->Project Settings-->InputManager。在脚本中通过使用虚拟轴名称获取自定义键的输入,使玩家可以在游戏启动时根据个人喜好对虚拟轴进行修改

Descriptive Name:游戏加载界面中,正向按键的详细描述

Descriptive Negative Name:游戏加载界面中,反向按键的详细描述

Negative Button:该按钮会给轴发送一个负值

Positive Button:该按钮会给轴发送一个正值

Alt Negative Button:给轴发送负值的另一个按钮

Alt Positive Button:给轴发送正值的另一个按钮

ps:一条虚拟轴最多可以绑定四个键,若超过四个,可以在新建同名的虚拟在绑定其余的键

Gravity:输入复位的速度,仅用于类型为键/鼠标的按键

Dead:任何小于该值的输入值(不论正负值)都会被视为0,用于摇杆

Sensitivity:灵敏度,对于键盘输入,该值越大则响应时间越快,该值越小则越平滑。对于鼠标输入,设置该值会对鼠标的实际移动距离按比例缩放

Snap:如果启用该设置,当轴收到反向的输入信号时,轴的数值会立即置为0,否则会缓慢的应用反向信号值。仅用于键/鼠标输入

Invert:启用该参数可以让正向按钮发送负值,反向按钮发送正值

Type

1.Key /Mouse:键/鼠标

2.Mouse Movement:鼠标移动和滚轮

3.Joystick Axis:摇杆

Axis:设备的输入轴(摇杆,鼠标,手柄等)

Joy Num:设置使用哪个摇杆,默认是接收所有摇杆的输入。仅用于输入轴和非按键

获取虚拟轴

以下代码均返回的是布尔型,故只能判断虚拟按钮绑定的按键是否按下

bool result=Input.GetButton("虚拟按钮名");bool result=Input.GetButtonDown("虚拟按钮名");bool result=Input. GetButtonUp("虚拟按钮名");

以下代码均放回的是浮点型,故可以判断虚拟轴的正负(-1~1),或说是按键在虚拟轴是代表的正负

float value=Input.GetAxis ("虚拟轴名"); float value=Input.GetAxisRaw("虚拟轴名");

镜头旋转

鼠标垂直移动使摄像机上下旋转,鼠标水平移动使摄像机左右旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;//控制摄像机随鼠标的移动而旋转
public class DoRotation : MonoBehaviour
{public float hor;public float rotateSpeed;private void FixedUpdate(){//鼠标移动float x = Input.GetAxis("Mouse X");float y = Input.GetAxis("Mouse Y");if (x != 0 || y != 0)RotateView(x, y);}private void RotateView(float x, float y){x *= rotateSpeed;y *= rotateSpeed;this.transform.Rotate(-y, 0, 0);this.transform.Rotate(0, x, 0, Space.World);}
}

玩家移动 

键盘垂直输入使飞机前后移动,键盘水平输入使飞机左右移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerController : MonoBehaviour
{public float moveSpeed = 10;private void Update(){float hor = Input.GetAxis("Horizontal");float ver = Input.GetAxis("Vertical");if (hor != 0 || ver != 0)Movement(hor, ver);}private void Movement(float hor, float ver){hor *= moveSpeed * Time.deltaTime;ver *= moveSpeed * Time.deltaTime;transform.Translate(hor, 0, ver);}
}

Unity脚本(四)相关推荐

  1. Unity(一)Unity脚本程序开发

    最近实验室有AR的项目,需要用Unity进行开发,一边学习一边把知识总结下来.在开始项目之前讨论过项目的技术方案,用Unity开发还是用Unreal开发,本人在两种游戏引擎上都有过初步的接触,认为Un ...

  2. Unity脚本(一)

    视频教程:https://www.bilibili.com/video/BV12s411g7gU/?p=112 目录 脚本 特性 控制台Console 脚本生命周期 Assembly-CSharp.d ...

  3. 【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图

    这是[Unity3D 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:生命周期流程图 二:常用的生命周期函数 三:脚本初始化和销毁 四:脚本的动态添加与静态添加 五:Awake ...

  4. 【Unity3D】Unity 脚本 ① ( 创建 C# 脚本 | Visual Studio 2019 中打开 C# 脚本 | 编译 C# 脚本 | 挂载 C# 脚本到游戏物体 | 运行脚本 )

    文章目录 一.创建 Unity 脚本 二.Visual Studio 2019 中打开 C# 脚本 三.编译 C# 脚本 四.挂载 C# 脚本到游戏物体 GameObject 1.添加组件方式 2.直 ...

  5. Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试

    1.什么是脚本生命周期? 首先什么是脚本 --- 脚本的本质其实就是类,而脚本生命周期其实就是脚本对应的那个类从开始工作到最后销毁这么一个周期 (或者说是Unity脚本从唤醒到销毁的过程) (消息,必 ...

  6. Unity脚本生成插件:Script Create Dialog

    最近写代码又犯懒了... 感觉每次新建脚本都要写一堆简单重复的东西好无聊,所以搜索了一下有没有自动生成脚本的插件.结果还真被我发现了,官方在N久之前就制作了自动生成脚本的插件[Script Creat ...

  7. unity脚本运行顺序具体的解释

    unity脚本自带函数执行顺序例如以下:将以下脚本挂在随意物体执行就可以得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Upd ...

  8. (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

    http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不 ...

  9. Unity脚本生命周期与执行顺序

    目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 @(文章目录) 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象 ...

  10. [Unity脚本运行时更新]C#7.3新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第8篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

最新文章

  1. 【视频】V4L2之应用流程
  2. 事物(Jdbc) 例子
  3. php xml expat,PHP 使用 XML Expat 解释xml文件
  4. 64位内核开发第14将,路径的相互转换以及获取.
  5. 用ISAPI Filter设置HttpOnly属性
  6. 从零开始--系统深入学习android(实践-让我们开始写代码-新手指南-6.使用Fragments构建动态UI)...
  7. 一步一步往前冲-WCF
  8. 解决Conda install tensorflow弹窗Python.exe已经停止工作的问题
  9. 修改fstab导致UBUNTU无法启动的解决办法
  10. 70个晨会激励哲理小故事
  11. STM32_OLED显示
  12. 宅男福利——在控制台上跳极乐净土(音频版)
  13. GIS常用数据平台网站
  14. HDU-5053 the Sum of Cube
  15. 建模专题1:石墨烯-氧化石墨烯及各种纳米材料体系的构建方法
  16. 双网卡共享上网的完全解决方案
  17. iOS开发者Matt Gemmell谈iOS 7
  18. 关于ant design pro中2个下拉列表,下列列表a的数据需要依据列表b选择的值来进行变化,无法及时获取
  19. 将列表(含字典)数据写入Excel
  20. 疯狂Java讲义(六)----第二部分

热门文章

  1. 程序员为维持游戏开发被迫炒股,一年内反赚1600万;雷军退任天星银行董事会主席;华为开源Karmada将捐赠CNCF...
  2. java.lang.ClassNotFoundException:org.springframework.transaction.TransactionException
  3. 用 python selenium 爬简书,Python自动化领域之 Selenium WebDriver 学习第2篇
  4. 易经中的企业管理思想[转帖] 来源: 中大管理论坛 梁育民
  5. 你是人间的四月天(3)
  6. 读《富兰克林传 绪》有感
  7. 【2020-MOOC-浙江大学-陈越、何钦铭-数据结构】春期中考试(附每一个题目的详细解析)
  8. Vue Get请求数据
  9. UOJ#414. 【APIO2018】新家
  10. Spark 内存管理存储内存管理_尚硅谷大数据培训