视频教程: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. 算法精解:DAG有向无环图
  2. 阿里、腾讯、美团、小米……各公司月饼大PK,看完简直想哭泣!
  3. 平板电脑计算机怎么关按键音,平板电脑输入法怎么设置【图解】
  4. Python enumerate索引迭代
  5. Yii的应用主体的配置
  6. DLL引用之SQLite在Win32、64下的兼容
  7. Docker安装Python3.5
  8. Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
  9. java.lang.IllegalStateException: Failed to load ApplicationContext selenium 异常 解决
  10. Windows10如何安装windows terminal
  11. 站在搜索引擎的视角看ASO,aso商店搜索引擎优化
  12. 【建议收藏】 11个适合程序员逛的在线社区
  13. 【软件实战】5分钟拥有一款自己的软件(教程+成品展示)
  14. 西门子1200控制V90伺服,西门子1200通过PN通讯控制V90伺服,程序控制采用FB285功能块
  15. Spark Container killed by YARN for exceeding memory limits. 11.1 GB of 11 GB physical memory used
  16. Apache新晋董事姜宁:从Apache Member到Apache董事,他花了11年
  17. 有感电机霍尔故障检测及修复
  18. 417,BFS和DFS两种方式求岛屿的最大面积
  19. 影视剪辑,如何进行混剪,镜头流畅衔接
  20. 帕斯卡计算机介绍,帕斯卡计算机:第一台受专利保护的计算机

热门文章

  1. POJ3107 Godfather 树形dp+模拟vector
  2. InfiniBand 网络
  3. iOS 设置代理详细步骤
  4. Qt的信号和槽是如何工作的
  5. k8s中pod删除不了的原因和正确的删除方法
  6. 本月腾讯,阿里,美团等技术团队的精品文章推送
  7. Empirical Covariance 经验协方差 sklearn
  8. ABP Module-Zero ASP.NET Boilerplate新手问题
  9. 洛谷 P1885 Moo
  10. Android 获取手机联系人代码