「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

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

    2024年04月16日
    浏览(53)
  • 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日
    浏览(48)
  • 数字逻辑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日
    浏览(40)
  • torch之optimizer.step() 与 scheduler.step() 的用法

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

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

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

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

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

    2024年02月01日
    浏览(33)
  • [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日
    浏览(37)
  • MATLAB中step函数的用法

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

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

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

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

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

    2024年02月09日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包