【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示
鼠标观察/键盘控制移动飞行/行走/碰撞检测
Unity版本:2019.4.23f1c1

  • 注意脚本名称和组件添加,不在文章中一一强调
  • 场景模型都是在资源商店选择的免费下载(选择Sort by Price(Low to High)排序)搜索参考关键字:airplane、sky
  • 整篇的实例代码是修改累加的,为了防止混乱我就全部贴上,不强调新增或删减部分

搭建:一架飞机模型(脚本挂载物体),天空盒(照明设置),摄像机Camera
原始画面:
在这里插入图片描述

跟随鼠标观察周围脚本

运行效果:

在这里插入图片描述
如果改为鼠标X则只能水平旋转(我这里是摄像机角度有些倾斜,不是飞机
在这里插入图片描述
在这里插入图片描述

using UnityEngine;
using System.Collections;public class MouseLook : MonoBehaviour
{//观察周围public enum RotationAxes{MouseXAndY=0,MouseX=1,MouseY=2}public RotationAxes axes = RotationAxes.MouseXAndY;public float sensitivityHor = 9.0f;//旋转速度public float sensitivityVert = 9.0f;public float miniumVert = -45.0f;public float maximumVert = 45.0f;private float _rotationX = 0;void Start(){Rigidbody body = GetComponent<Rigidbody>();if (body != null)body.freezeRotation = true;}// Update is called once per framevoid Update(){if (axes == RotationAxes.MouseX)//水平旋转{transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);//GetAxis()获取鼠标的输入}else if (axes == RotationAxes.MouseY)//垂直旋转{_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;//基于鼠标增加垂直角度_rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);//将垂直角度限制在最小值和最大值之间float rotationY = transform.localEulerAngles.y;//保持Y的角度一样(也就是水平没有旋转)transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);//使用存储旋转值创建新的Vector}else//水平且垂直旋转{_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;_rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);float delta = Input.GetAxis("Mouse X") * sensitivityHor;//旋转变化量float rotationY = transform.localEulerAngles.y + delta;//使用delta增加旋转角度transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);}}
}

第一人称控件

在这里插入图片描述

运行效果:键盘WSAD或上下左右,鼠标移动水平高度
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


//using System.Collections.Generic;
using UnityEngine;
using System.Collections;public class FPS : MonoBehaviour
{public float speed = 3.0f;//观察周围public enum RotationAxes{MouseXAndY = 0,MouseX = 1,MouseY = 2}public RotationAxes axes = RotationAxes.MouseXAndY;public float sensitivityHor = 9.0f;//旋转速度public float sensitivityVert = 9.0f;public float miniumVert = -45.0f;public float maximumVert = 45.0f;private float _rotationX = 0;void Start(){Rigidbody body = GetComponent<Rigidbody>();if (body != null)body.freezeRotation = true;}// Update is called once per framevoid Update(){if (axes == RotationAxes.MouseX)//水平旋转{transform.Translate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);//GetAxis()获取鼠标的输入}else if (axes == RotationAxes.MouseY)//垂直旋转{_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;//基于鼠标增加垂直角度_rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);//将垂直角度限制在最小值和最大值之间float rotationY = transform.localEulerAngles.y;//保持Y的角度一样(也就是水平没有旋转)transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);//使用存储旋转值创建新的Vector}else//水平且垂直旋转{_rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;_rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);float delta = Input.GetAxis("Mouse X") * sensitivityHor;//旋转变化量float rotationY = transform.localEulerAngles.y + delta;//使用delta增加旋转角度transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);}float deltaX = Input.GetAxis("Horizontal") * speed;float deltaZ = Input.GetAxis("Vertical") * speed;transform.Translate(deltaX, 0, deltaZ);}
}

碰撞检测

问题:如果前面有一堵墙飞机往前会直接穿过去
在这里插入图片描述

运行效果:碰到墙壁无法穿过
在这里插入图片描述

在这里插入图片描述


//using System.Collections.Generic;
using UnityEngine;
using System.Collections;public class FPS : MonoBehaviour
{public float speed = 3.0f;private CharacterController _charController;void Start(){_charController = GetComponent<CharacterController>();}// Update is called once per framevoid Update(){float deltaX = Input.GetAxis ("Horizontal") * speed;float deltaZ = Input.GetAxis ("Vertical") * speed;Vector3 movement = new Vector3 (deltaX, 0, deltaZ);movement = Vector3.ClampMagnitude (movement, speed);movement *= Time.deltaTime;movement = transform.TransformDirection  (movement);_charController.Move (movement);}
}

重力添加

添加重力gravity就能改为陆地行走,在面板将重力改为0则飞行模式
在这里插入图片描述

using System.Collections;
using UnityEngine;[RequireComponent(typeof(CharacterController))]
[AddComponentMenu("Control Script/FPS Input")]
public class FPS : MonoBehaviour
{public float speed = 6.0f;public float gravity = -9.8f;private CharacterController _charController;// Start is called before the first frame updatevoid Start(){_charController = GetComponent<CharacterController>();}// Update is called once per framevoid Update(){float deltaX = Input.GetAxis("Horizontal") * speed;float deltaZ = Input.GetAxis("Vertical") * speed;Vector3 movement = new Vector3(deltaX, 0, deltaZ);movement = Vector3.ClampMagnitude(movement, speed);movement.y = gravity;movement *= Time.deltaTime;movement = transform.TransformDirection(movement);_charController.Move(movement);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/166460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 设置 Git 在左侧展示

File->settings->Version Control->commit 勾选 Use non-model commit interface

Spring Gateway基础知识总结

本文主要总结Spring Gateway的基础用法&#xff0c;内容包括网关、Spring Gateway工作流程、Spring Cloud Gateway搭建、路由配置方式、负载均衡实现、断言工厂这几个部分 目录 1. 网关 1.1 网关介绍 1.2 网关对比 1.3 Spring Gateway 1.4 核心概念 1.6 总结 2. Spring …

【Delphi】Android 开发HTTP请求出错解决方案

目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站&#xff08;注意不是https&#xff09;&#xff0c;出现如下错误提示&#xff1a; 在使用ntfy的时候&#xff0c;访问http定义的服务器地址&#xff08;注意不是…

基于 Python 的课程助教智能聊天机器人

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 课程助教是高校中一种常见的教学模式,其在学生理论知识的掌握与实践能力的提高方面起到关键性的作用,已经成为高校日常教育环节中不可或缺的一环。然而,传统的人力助教有若干关键问题亟待…

leaflet:个性化配置,利用Leaflet-Geoman绘制多种图形(136)

第136个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中个性化配置,利用Leaflet-Geoman绘制多种图形。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…

es6过滤对象里面指定的不要的值filter过滤

//过滤出需要的值this.dataItemTypeSelectOption response.data.filter(ele > ele.dictValue tree||ele.dictValue float4);//过滤不需要的值this.dataItemTypeSelectOption response.data.filter((item) > {return item.dictValue ! "float4"&&it…

PCIe寄存器之二

关键字索引&#xff1a; CAP_PM 对应&#xff1a;Capabilities: [c0] Power Management CAP_MSI 对应&#xff1a;Capabilities: [c8] MSI CAP_MSIX对应&#xff1a;Capabilities: [e0] MSI-X CAP_EXP 对应&#xff1a;Capabilities: [70] Express (v2) Endpoint 以上 [] 内的…

C++:类和对象(下)

1.再谈构造函数&#xff1a; 构造函数体赋值&#xff1a; 回顾&#xff1a;在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day d…

亚马逊云科技海外服务器初体验

目录 前言亚马逊云科技海外服务器概述注册使用流程实例创建性能表现用户体验服务支持初体验总结 前言 随着云原生技术的飞速发展&#xff0c;越来越多的企业和开发者选择云服务器来作为自己的使用工具&#xff0c;云原生技术的发展也促进了云服务厂商的产品发展&#xff0c;所…

【树的存储结构,孩子链表】

文章目录 树和森林树的存储结构孩子链表 树和森林 森林&#xff1a;是m(m>0)棵互不相交的树的集合。 树的存储结构 1.双亲表示法 实现&#xff1a;定义结构数组存放树的结点&#xff0c;每个结点含两个域。 数据域&#xff1a;存放结点本身信息。 双亲域&#xff1a;指…

pip无法下载moviepy -无法联网

猜测是无法联网 尝试更新匹配 ——失败 尝试1&#xff1a;从网络下载whl文件——还需要下载相关依赖&#xff0c;过于麻烦 但应该可行 下载地址 https://pypi.tuna.tsinghua.edu.cn/simple/对应的包名/ 可能会出现如下&#xff0c;然后继续挨个找 尝试2&#xff1a;使pip联网…

UART编程(寄存器)

1. 串口编程步骤 1.1 看原理图确定引脚 有很多串口&#xff0c;使用哪一个&#xff1f;看原理图确定 1.2 配置引脚为UART功能 至少用到发送、接收引脚&#xff1a;txd、rxd 需要把这些引脚配置为UART功能&#xff0c;并使能UART模块 1.3 设置串口参数 有哪些参数&#xf…