「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾

这篇具有很好参考价值的文章主要介绍了「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

配合视频食用效果更好哦~

Step by step的太空垃圾清理游戏教程-Part 4

作为太空环境保护者,除了控制飞船移动外,我们还可以切换前视镜和后视镜。在前视镜状态下,驾驶员需要驾驶飞船碰撞垃圾来收集它;在后视镜的状态下,驾驶员只需要点击垃圾,垃圾就会自动被收集。在本节中,我们将用trigger,camera,screen和tag来完成这两个状态。

切换前后镜头 – enabled & SetActive

首先,让我们实现切换前后镜头的功能。我们已经有了一个主镜头“Main Camera”在飞船前侧作为主视角。接下来,需要另一个镜头放到飞船后侧。

  • GameObject - Camera 新建一个镜头。更改名为“Back Camera”

  • 将Back Camera移动到Spacecraft的下方,成为Spacecraft的子物体(child)

    • 开始运行后,Back Camera也会跟着Spacecraft一起移动了

  • 将镜头的位置移动到飞船的后侧,调整角度到合适的视角。

    • 单击镜头,在场景右下角能够看到镜头的视角

添加后视镜头后,我们来完成前后镜头的切换。我选择的交互方式是添加一个“前/后”的按钮,用来转换前后镜头。当然,也有其他同样合适的方式,其中逻辑都是类似的。

建一个按钮(Button):

  • 右击“Canvas” – UI – Button-TextMeshPro

    • TextMeshPro指的是按钮上的文字,可以用TextMeshPro而不仅仅是简单的Text。如果是第一次用到Button,在弹出的对话框中选择“import TMP Essentials”

    • Button的初始结构是Button - Text。在Button的“Image”中调整按钮的背景,Text中修改文字和字体...

  • 重命名为“Back Camera Button”。选择合适的背景颜色。将按钮的文字改成“Back Camera”。调整按钮的大小和位置。

  • 复制整个按钮,用作前镜头切换。只需要修改名称和文字为“Front Camera”。

    • 两个按钮是为了能够切换。

添加按钮后,我们可以用它来控制两个镜头的“开/关“。这里要用到一个常用的功能——SetActive。通过把后面的参数设置为True或False,它能够把某个GameObject设置为Active(开)或inactive(关)。

  • 新建一个Script,命名为“CameraManager”。

  • 新建两个公开的变量frontCam和backCam,用来代表两个镜头。

public Camera frontCam;

public Camera backCam;
  • 在Start中,用enabled来设置两个镜头的初始状态

frontCam.enabled = true;

backCam.enabled = false;
  • 新建两个公开的按钮变量frontButton和backButton

public Button frontButton;

public Button backButton;
  • 记得先在script的顶端导入UnityEngine.UI,这条指令使我们能够运用Button

using UnityEngine.UI;
  • 在Start中,用AddListener设置两个按钮在被按时的要执行的操作

backButton.onClick.AddListener(BackClick);

frontButton.onClick.AddListener(FrontClick);
  • AddListener是一个常用的监听方法。前面加上onClick,Listener会在按钮被按到的时候执行后面参数中的方法。因此AddListener在设定按钮时很常用。

  • 来定义BackClick和FrontClick两个方法。

void BackClick()

{

frontCam.enabled = false;

backCam.enabled = true;

backButton.gameObject.SetActive(false);

frontButton.gameObject.SetActive(true);

}



void FrontClick()

{

backCam.enabled = false;

frontCam.enabled = true;

frontButton.gameObject.SetActive(false);

backButton.gameObject.SetActive(true);

}
  • 在被点到后,它们要做的是:控制相应镜头的开关、关掉另一个镜头、关掉此按钮、打开另一个按钮

「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾,开发语言,游戏引擎,unity,用户界面,3d,c#

按钮逻辑图

  • 保存并回到编辑器,新建一个空的GameObject,命名为“Camera Manager”。

  • 将CameraSwitch拖拽到Camera Controller中。并将公开变量赋值。

获取和转换屏幕点击位置 – Touch & Raycast

后视镜状态中,如果玩家点击太空中的垃圾,垃圾将会消失(被收集)。Unity用Touch这种类型来代替触碰屏幕的动作。Touch有很多自带的属性方便运用,比如phase代表触碰的阶段,position代表屏幕上被触碰的像素点位置等。可以用Input.touchCount> 0这个条件来判断屏幕是否被触碰,如果触碰的个数touchCount大于0,就说明有触碰存在,就是时候进行下一步了。

前面提到,可以用touch.position获取被触碰的像素点位置,就能得到玩家想要点击的地方。但问题是,屏幕是一个2D的平面,但我们的游戏是3D的世界,将得到的(x,y)直接当成(x,y,z)使用显然行不通。所以,我们需要将2D位置转换成3D镜头中的Ray。Ray的本意是“射线”,有着方向和起点。它与touch.position的最大不同在于,前者是相对于镜头,而后者是相对于屏幕。最后,将射线转换为RaycastHit,指的是射线碰到的物体。注意,只有带有collider的物体才能够被射线触碰到。点开两种垃圾的prefab,它们都应该有collider。

「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾,开发语言,游戏引擎,unity,用户界面,3d,c#

position → Ray → RaycastHit

  • 双击打开spacecraft代码文件,

    • 在update中,首先判断是否在后视镜头的状态下。如果是,进行后续。如果不是,则不需要做任何事。

  • 创建公开的镜头变量backCam

  • 在update中,判断backCam是否为enabled的状态

if (backCam.enabled) // Only enable touch-collecting when back camera is active

{



}
  • 判断是否有点击存在。如果发生了点击,对于每个点击我们都需要执行相同的步骤:

if (Input.touchCount> 0)

{

    foreach (Touch touch in Input.touches)

    {
        ...


    }

}
  • 先获取touch的位置,用ScreenPointToRay转换为Ray。再将ray转换为RaycastHit。通过RaycastHit的属性得到点击到的gameObject

Ray ray = backCam.ScreenPointToRay(touch.position); // Convert ray to camera view pos

RaycastHit hit;



if (Physics.Raycast(ray, out hit))

{

    ...

}
  • 最后,我们用hit.transform.gameObject来获取点击到的物体,并使之消失

GameObject obj_hit = hit.transform.gameObject;

obj_hit.SetActive(false);
  • 保存代码,回到编辑器。别忘了拖拽给backCam赋值

分类好帮手 – Tag

现在,在后视镜中,被点击到的物体都会消失。但问题是,垃圾之外的物体,比如星球、人造卫星等任何有collider的物体,都会消失。因此,需要一个条件来判断碰到的物体是不是垃圾。Unity中,常用的分类物体方法是加“标签”tag。可以自己创造标签,比如Moon Trash,Space Trash。多个物体可以用同一个标签。Unity还贴心的准备了很多好用的方法,比如FindWithTag,CompareTag等,非常方便。

给场景中的垃圾加上标签。

  • 在Inspector中,选择tag的下拉键,点击“Add tag…“

「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾,开发语言,游戏引擎,unity,用户界面,3d,c#

(给物体加上标签

「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾,开发语言,游戏引擎,unity,用户界面,3d,c#

创建新标签

  • 在新窗口中点击加号,输入标签的名称。分别创建”Moon Trash“和”Space Trash“两个标签。

  • 点击每一个垃圾物体,下拉tag,刚刚创建的标签中选择相应的。

加上标签后,还需要在script中加入判断标签的条件。

  • 双击打开spacecraft代码文件,在obj_hit.SetActive(false);之前加上判断条件

if (obj_hit.CompareTag("Moon Trash"))

{

    obj_hit.SetActive(false);

}



if (obj_hit.CompareTag("Space Trash"))

{

    obj_hit.SetActive(false);

}
  • 保存

注意,CompareTag后的标签内容一定要和创建的 一 模 一 样!不然的话,CompareTag会返回false值,也就无法进行后面的步骤了

在Unity中运行时,你可能会发现点击垃圾没有反应。这不是你的错,只是鼠标的点击无法被算作“Touch”。也就是说,只有在手机上测试才会有效果。后面的章节会介绍在手机上测试的简便方法。

如果有任何疑问或者建议,也欢迎在下方留言评论哟~文章来源地址https://www.toymoban.com/news/detail-822699.html

到了这里,关于「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 微信小程序通知,微信小程序长期订阅消息添加硬件设备能力的设备订阅消息step-by-step

    微信小程序通知,微信小程序长期订阅消息添加硬件设备能力的设备订阅消息step-by-step

    本文目的,分享一个实际案例: 开发微信小程序的报警器的微信订阅消息, 设备报警后触发微信报警 前提: 有一个微信小程序并且微信认证过。 1: 添加设备申请权限 2:按照实际情况填写设备信息, 一般等两天到三天能审核过  3: 申请设备消息能力 , 这个一部不做的

    2024年04月16日
    浏览(11)
  • Sitecore10 Demo演示环境Azure一键部署(Step By Step Guide to installing Sitecore10 in Azure Paas)

    Sitecore10 Demo演示环境Azure一键部署(Step By Step Guide to installing Sitecore10 in Azure Paas)

    本文演示Sitecore XP Single(XP0)在Azure上的一键部署,即“30分钟生成Sitecore演示环境”的一环。 关于XP(即Sitecore Experience Platform) roles的相关介绍移步 XP Single配置主要用来开发和测试: Four Sitecore roles: Content Delivery, Content Management, Processing, and Reporting as a single WebApp instance.(cd,

    2023年04月25日
    浏览(13)
  • 数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 4(step by step)

    数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 4(step by step)

    第四章 重要内容:1、多路选择器  2、采用香农展开的多路选择器综合 3、译码器  4、多路分配器  5、优先级编码器  6、代码转换器  7、算数比较电路  8、Verilog语法 纠错:4-11香农展开式最后结果应该是同或门。 Chapter 4 Chapter 4, Problem 1P Chapter 4, Problem 2P Chapter 4, Problem 3P

    2024年02月05日
    浏览(12)
  • torch之optimizer.step() 与 scheduler.step() 的用法

      首先需要明确optimzier优化器的作用, 形象地来说,优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用,这也是机器学习里面最一般的方法论。   optimizer.step()通常用在每个mini-batch之中,可以根据具体的需求来做。只有用了

    2024年02月16日
    浏览(10)
  • 【博客692】grafana如何解决step动态变化时可能出现range duration小于step

    【博客692】grafana如何解决step动态变化时可能出现range duration小于step

    grafana本身是没有提供step参数的,因为仪表盘根据查询数据区间以及仪表盘线条宽度等,对于不同查询,相同的step并不能很好的发挥作用,所以step是动态计算的 所以在Grafana中并没有直接提供step参数,而是这两个参数:min step和resolution min step: min step故名思义设定的是step的

    2024年02月13日
    浏览(9)
  • 关于STEP文件格式的介绍

    关于STEP文件格式的介绍

    Step文件(也称为STandard for the Exchange of Product data,或简称STEP或 ISO 10303 )是一种用于表示三维CAD数据的标准文件格式。它是一种 中立的格式 ,可以在不同的CAD软件之间进行交换和共享,因为它不依赖于任何特定的CAD软件。 Step文件的格式 基于一系列的实体(entity)和属性(

    2024年02月01日
    浏览(12)
  • [COCI2010-2011#6]STEP

    [COCI2010-2011#6]STEP

    目录 1.题目: 题目描述 输入格式 输出格式 2.思路 1.ans数组的维护 2.L and R 的维护 3.ne数组与pr数组的维护 4.len数组:  3.代码: 1.有注释版: 2.copy版: 给定一个长度为N的字符序列  ,初始时序列中全部都是字符L。 有 q次修改,每次给定一个 x,若为L,则将 修改成R,否则将

    2024年02月15日
    浏览(8)
  • MATLAB中step函数的用法

    MATLAB中step函数的用法 step函数是MATLAB中的一个重要函数,用于绘制系统的阶跃响应图。它可以帮助工程师和科学家分析和设计控制系统。本文将详细介绍step函数的用法,并提供相应的源代码示例。 step函数的基本用法如下: 其中,sys是一个线性系统模型对象,可以是连续时间

    2024年02月03日
    浏览(5)
  • 西门子_Step7软件仿真方法

    西门子_Step7软件仿真方法 现在的PLC厂商提供的开发环境都具备仿真能力。无论是西门子、三菱、罗克韦尔还是ABB 或是其他一些厂商提供的产品都具有仿真功能。 仿真就是在没有硬件的情况下来测试程序功能,同时也为初学者提供了方便,即便没有硬件 我们也能进行试验,可

    2024年02月06日
    浏览(11)
  • RK3588环境配置过程全记录 step 1

    RK3588环境配置过程全记录 step 1

    最近在做毕设,由于是第一次接触NPU,所以踩了不少坑,顺便将它记录下来,防止后来者继续踩(doge)hh。 许多人都和我一样,刚到手拿到一块NPU算力版的时候都不知道从何下手,是先在PC端操作呢还是直接在板子上操作? 本人虽然熟悉一些类似于STM32 ,esp等板子,但是也是

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包