【Ruby‘s adventure】Unity期末上机考试题目预测与解析(6/17已更新)

2023-10-07 04:50

本文主要是介绍【Ruby‘s adventure】Unity期末上机考试题目预测与解析(6/17已更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Ruby’s adventure】Unity期末上机考试题目预测与解析

说明:针对于6月18日Unity上机考试,不少同学问我有关考试怎么弄,为此写一篇博客讲一下我自己的理解。

目录

    • 【Ruby's adventure】Unity期末上机考试题目预测与解析
  • 一、考题预测
    • (一)、考试内容
    • (二)、考题预测
      • 1.相关说明
  • 二、对应解析
    • (一)、相关题目解析
    • (二)、必要说明
  • 三、结语
  • 四、(更新改进内容)如何更加准确的击中Ruby及相关原理

一、考题预测

(一)、考试内容

考试内容:Ruby‘s adventure案例的修改,老师给完整案例后在完整案例的基础上按照老师的要求添加三个功能,也可以自行添加功能,老师要求的功能必须添加,不会的可以自己加功能,老师给给分,但是不会有原来的高。
举个栗子🌰,老师三个要求每个要求10分共三十分,我只会两个,另一个我不会,但是我自己加了一个功能,老师觉得我那个功能还行,给了我8分,那么我最后就是20+8=28分。

(二)、考题预测

由于学的东西比较简单,所以考得也不会很难,按照老师之前说的话,结合大家技术水平,考题预测如下:

  1. 场景内机器人计数功能:如下图所示
    包括:1.未被修复的机器人存在的数量;2修复的机器人的数量.

  2. 接受任务计时以及完成任务结束计时功能 || 整个游戏的计时功能
    在这里插入图片描述
    图中当Ruby跟青蛙对话后开始计时,由于GIF上传的大小有上限这里就截图了,不然有动图。

  3. 场景中计时计数相应GUI的添加:如上图所示

  4. 机器人发射子弹:
    在这里插入图片描述

  5. 机器人发射的子弹对Ruby会造成伤害
    在这里插入图片描述

  6. 退出游戏功能//重玩功能

  7. 机器人修复功能:在一段时间内攻击机器人两次,否则机器人会自动回血。举个栗子🌰,我要在两秒钟内击打机器人两次才算修复机器人,从我打了机器人开始后的两秒,这两秒内我没有打机器人,那么机器人就自动回血,也就是说我要修复他,还得打他两次,且要在两秒内。

  8. 代码数值的修改:1.陷阱对Ruby造成的血量更多或更少;2.草莓恢复的血量更多或更少;3.机器人被击打修复的次数;4.无敌时间的修改;5.重生位置的修改。

  9. 改变机器人的行走路线:使其不仅可以上下行走也可以左右行走,可以随时转换

  10. 机器人也可以伤害Ruby

  11. 子弹限制功能 || 子弹包拾取功能

1.相关说明

大体上我先例举一些考得可能性比较大的,在这里面的1、3、4、5、7、8、9中可能会出考题,一个题目可能会包含多个考题,举个栗子🌰:比如要你弄个计数的功能,那计数了就得显示出来,相应的就会要你弄GUI那么这个题目就包含了1、3两个题目。
当然,如果这些题目没有考到,那么也可以作为自己的功能添加上去,也能加分,只是加得没那么多,过还是没问题的。

二、对应解析

(一)、相关题目解析

1.场景内机器人计数功能:这个计数的数据我们上课已经做好了,只需要找出来显示出来就行了,在我们的脚本里面找到一个脚本,名为NPCDialog,在其中我们可以发现一个函数

public void displayDialog(){if (b != 1){a = 1;Dialog.SetActive(true);timer = displayTime;UIHealthBar._instance.hasTask = true;if (UIHealthBar._instance.fixnum >= 4) //就是这行UIHealthBar._instance.fixnum >= 4{DialogText.text = "Thanks you , you are good!";b = 1;if (!hasCompleteTask){audioSource.PlayOneShot(CompleteClip);hasCompleteTask = true;}}}}

这句代码的意思就是当修复的机器人大于4个后,就可以执行if里面的代码,我们可以找到其原本的脚本,也就是UIHealthBar,发现此脚本已经被实例化,同时有两个参数,一个是修复好的机器人数量,一个是未修复好的机器人数量,且此脚本被实例化,能够被其它脚本调用,那这就很好办了。
在这里插入图片描述
那么我们只需要在我们修复好机器人后将修复好的数值加加,未被修复好的数组减减即可,为此我们找到控制机器人的脚本,找到修复的函数,加上对应的代码即可:
在这里插入图片描述
接下来就得让它显示出来,为此我们要自己加代码,方法很多,我是自己新建了一个脚本写的,关健代码如下:

    public Text norepaire;  //未修复机器人计数的文本框public Text repaire;    //修复机器人计数的文本框public int isRepair = 0;public int noRepair = 7;public Text time;      //场景计时float timer = 0;private void Start(){}private void Update(){//这里下面if(NPCDialog._instance.a==1)if (NPCDialog._instance.b!=1){timer = timer + Time.deltaTime;}//这里上面不用写 这是我加的任务完成计时功能,想加也可以,我会把我的NPCDialog相关代码给大家isRepair = UIHealthBar._instance.fixnum;noRepair = UIHealthBar._instance.unfixumn;repaire.text = isRepair.ToString() + " 个";norepaire.text = noRepair.ToString() + " 个";Debug.Log("isRepair: "+isRepair);time.text = timer.ToString("f1") + " s";}

NPCDialog相关代码:a,b是我设置的参数来控制计时的,逻辑自己看,解释有点麻烦

 public void displayDialog(){//a,b自己定义 类型public int  初始值为0if (b != 1){a = 1;Dialog.SetActive(true);timer = displayTime;UIHealthBar._instance.hasTask = true;if (UIHealthBar._instance.fixnum >= 4){DialogText.text = "Thanks you , you are good!";b = 1;if (!hasCompleteTask){audioSource.PlayOneShot(CompleteClip);hasCompleteTask = true;}}}}

最后在场景里面摆放好UI,然后将文本框拖拽给你新建的脚本即可:(Camera Fellow是我自己新建的脚本)
在这里插入图片描述
2.机器人发射子弹:当Ruby进入到机器人的攻击范围,机器人向Ruby发射子弹
方法:范围检测,射线检测(99%的都是范围检测,除非不会就搬运与青蛙对话的射线检测)
实现步骤:
(1)新建一个空对象并重命名,并给其给添加一个范围检测的collider 2D,我是用的圆形collider,添加脚本,我的脚本名是AttackRuby,记住要勾上is Trigger,可以自行修改检测范围
在这里插入图片描述
(2)AttackRuby脚本的编写:这个不需要像我那么复杂,我那纯粹是为了好玩,实现的效果如下,进入攻击范围后就会攻击,离开后不会攻击效果图如下
在这里插入图片描述

我么可以修改代码里面的一些数值来修改发射子弹的速度

    public GameObject Ruby_vector2;public GameObject BulletPrefab;public Rigidbody2D RubyRigidbody2D;public float N = 50;  //射击速度bool isAttack = false; //模式1触发void Update(){//Ruby进入检测范围后 isAttack变为true 同时time开始计时if(isAttack){time = time + Time.deltaTime;if(time>=0.25)//当time>0.25s 调用函数发射子弹 同时time=0 开始重新计时 这里设置射击间隔{Launch();time = 0;} }private void Launch(){GameObject bullet = Instantiate(BulletPrefab, transform.position, Quaternion.identity);  //Quaternion.identity 没有角度 (0,0,0)//生成一个预制体bullet.GetComponent<bullet>().Lauch(RubyRigidbody2D.position+Vector2.up*2, N);// bullet.GetComponent<bullet>().Lauch( Ruby_vector2.transform.position, N);//获取生成物体子弹上的脚本bullet,并调用其发射函数Lauch,里面的参数为位置,发射速度//在这里我们要改一下发射的位置(方向),改为Ruby的位置//再说明一下,由于每个人的场景大小不同,Ruby大小也有偏差,加上Ruby的中心在脚下,为了让子弹能够打到Ruby,我们需要对其位置微调,也就是向上调整一段距离,加一个vector2.up乘以一个数值,这个数值每个人因人而异,大体上差不多}private void OnTriggerEnter2D(Collider2D collision)//进入范围攻击{//将Ruby的标签改为Rubyif(collision.tag=="Ruby"){isAttack = true;}}private void OnTriggerExit2D(Collider2D collision)//离开范围不攻击{if (collision.tag == "Ruby"){isAttack = false;}}

我们攻击时是攻击Ruby的中心,而Ruby的中心在脚部,所以我们得微调:
在这里插入图片描述
说明:你在完成这个东西的时候会发现,子弹会有些许偏差,原因是因为在Ruby移动的过程中其Rigidbody2D位置发生了改变,所以会有偏差,如果是换成我下面注释的代码后,就不会出现,但是射击中心不太准,在Ruby的脚部,这个时候我们就需要改变Ruby位置的中心,我花了一些时间做了修改,包括代码的形式,调整Sprite Renderer的相关参数,都没有用,主要是因为这不是一个image,按理来说将Piovt修改成Center就没事了,但是没有成功,应该是需要在最开始的Ruby上进行修改,但是我的Ruby已经修改过了,没有原版了,就先放在这里,也有可能是需要在项目设置里面去进行调整,当然了如果你成功的调整好了可以在评论下方提出你的见解,我调整好后也会第一时间更新。在这里插入图片描述
正常的位置:
在这里插入图片描述
最后赋值即可:预制体就是子弹
在这里插入图片描述
附加说明:当然了也可以给Ruby身上面加一个空物体,将其的位置赋值给目标,调整空位置的位置到Ruby中心,这个理论上是可以的,实践上还是有问题,个人觉得还是跟脚本有问题,后面再改吧。

3.子弹对Ruby造成伤害:
这个有很多方法:1.可以给Ruby写代码;2.可以个给子弹写代码;
原理:碰撞检测+传参
方法:当然了,这里推荐一个很简单的方法,找到子弹预制体,为其添加一个我们写好了的陷阱脚本即可,脚本名为:
在这里插入图片描述
相关提示与说明:由于有陷阱有无敌功能,如果题目要求子弹打中就掉血,没有无敌功能,那么我们就需要进行适当修改:
他是通过调用Ruby脚本中的changehealth方法来修改血量的,对此我们要修改的话就需要找到对应的函数进行修改,修改changehealth
陷阱脚本中调用的方法:
在这里插入图片描述
Ruby脚本中修改血量的方法:
在这里插入图片描述
当然了,具体题目怎么样改,改不改我也说不准,告诉大家怎么改。
也可以自己通过添加脚本的形式来修改血量,但是要注意两个事情:
1.利用碰撞检测
2.调用changehealth(可以用老师的,也可以自己写改变血量的脚本)
3.最后调用UIHealthBar._instance.SetValue(Mathf.Lerp(a / (float)maxHealth, b / (float)maxHealth,1f));来修改血量的显示
在这里我就不做过多说明。

4.退出游戏功能 || 重玩功能
退出游戏的函数:

public void GetExit()//退出运行{
#if UNITY_EDITORUnityEditor.EditorApplication.isPlaying = false;//用于退出运行#else
Application.Quit();
#endif}

随便写在一个脚本里面,再在场景外面弄一个Button,点加号
在这里插入图片描述
将你添加这个退出函数的脚本的物体拖拽给他,在下拉菜单中找到脚本名称,找到对应函数即可,我这里举个🌰

在这里插入图片描述
游戏的重玩:
首先需要在Bulit setting里面找到对应的设置
在这里插入图片描述
记住每个场景后面的编号,没有当前场景的就添加场景
和退出函数的调用方法一样,在脚本中的引用加上:

using UnityEngine.SceneManagement;

顺便说一下,用了图片和文本框的需要引用:

using UnityEngine.UI;

然后写下函数:

 public void PlayeAgain(){SceneManager.LoadScene(1); //你要重玩的/加载的场景编号,看上面图}

用button来调用此方法,与退出游戏相似

5.机器人自动回血:
逻辑:第一发子弹攻击后的两秒内如果不再进行下一次攻击,机器人要被修复,需要被击打两次
实现流程:
1.给机器人添加一个碰撞检测的代码,检测第一次攻击,当检测第二次攻击后再调用修复函数
在这里插入图片描述
当hit>=2时调用被修复,每次击打一次就hit++
2.当第一次被击打后,isRepairing变为true,开始计时
在这里插入图片描述
JishiTime的初始值为2s,如果在两秒内没有修复好的话,hit=0,机器人回血,jishiTime=2,同时isRepairing=false;停止计时,以此来达到一个自动回血的效果,下面的代码写在Update里面,每时每刻都要检测,方法很多,我的思路大致是这样,之前帮人改东西,把我的代码给改坏了,现在演示不出来,应该没有什么问题。
没有的参数自己看类型定义一下!!!

6.改变机器人的行走:
原理:跟机器人自动回血差不多,设置一个计时功能,计时结束后,将其vertical改为false即可:
在这里插入图片描述
时间问题我就不多说了,这里我现在写了4个小时了

7.机器人伤害Ruby:给机器人添加陷阱脚本,改变一下collider的范围,类似于解析2

8.子弹限制功能 || 子弹包拾取功能
(1)把子弹包拖拽进场景中,调整好其大小,为其添加box collider 2D,勾上 is trigger
在这里插入图片描述
(2)为子弹包添加脚本:我起名为BulletPag,其代码如下

 private void OnTriggerEnter2D(Collider2D collision){if(collision.tag=="Ruby"){   //给Ruby打上标签为RubyPlayerMove playermove = collision.GetComponent<PlayerMove>();playermove.bulletnum = playermove.bulletnum + 30;Destroy(this.gameObject);}}

在Ruby的脚本中添加相关代码:
定义变量部分:定义子弹数和显示子弹数的文本框

public Text bulletnumText;
public int bulletnum = 30;

Update函数中:显示剩余子弹数

bulletnumText.text = bulletnum.ToString()+"个";

修改部分:

 if(bulletnum>0) //当子弹数大于零才能发射子弹,一开始子弹数是30,不影响其他功能,因为有一个地方是要跟青蛙对话后才能够发射子弹的功能if (Input.GetKeyDown(KeyCode.Space)){Launch();bulletnum--;  //发射一次子弹子弹数减少spark.Play();}

再在场景外面设置UI:
在这里插入图片描述
并把相应的文本框拖拽给脚本:上面定义了一个Txet文本框
拓展:这里面还可以加上换弹夹的功能,简答说一下,当子弹发射完后,并且还有剩余子弹,那么需要按下一个按键后才能够按下空格键发射子弹,需要在加上一个子弹计数变量来存储子弹剩余数,按下键后相应的减少对应的数,子弹数相应的加上相应的数,还有很多可以修改的地方,我就不一一细说了。

(二)、必要说明

1.这个案例的代码有些地方是我自己写的,和老师写的不一样,大同小异,所以可能你照着我的写,在涉及到老师的代码时,可能会出错,但是概率还是很小,也不排除自己的原因打错看错出错,主要参考看我的逻辑和方法。
2.个别地方省略了一些很简单的步骤,加UI的地方就不多说了
3.不是要知道整个代码才能做出来,知道逻辑和一些关键代码也能够写出来

三、结语

1.考试应该不会很难,所以不需要太慌张,这里推荐给你一个完整的Ruby教程,你觉得我的不太行,你也可以从这里面去学习一些东西:点击跳转:Ruby官方案例完整版
2.要明白代码的意思和逻辑,明白一些操作为什么要那么操作,如果不那么操作那么写会产生什么结果,这对于日常学习尤为重要
3.养成独立思考的习惯,遇事后自己先独立思考,不到万不得已实在没办法绝不向别人求助,培养自己的钻研精神,有些东西仔细自己想想并不难,不要养成过渡依赖别人的习惯
4.本次考试为开卷考试,可以提前做好一些功能,把相关代码写在纸上,带入考场,如果觉得本篇内容还行,也可以将本篇内容打印出来带入考场,
5.祝大家考试顺利!

四、(更新改进内容)如何更加准确的击中Ruby及相关原理

前言:这两天同学们可能试了一下我的子弹发射功能,但是大家可以发现,他并不是很准确,特别是在斜对角的时候,偏差太大!!,只有在正上、下、左、右的方向是比较准的,这就让我想起了一个问题!没错,就是方向的问题!!!!
我们之前的代码如下:

bullet.GetComponent<bullet>().Lauch(RubyRigidbody2D.position+Vector2.up*2, N); 
bullet.GetComponent<bullet>().Lauch(AttackVect, N);

大致一看,诶,确实没啥问题,发射的时候,里面的参数是一个方向×速度;这里的方向参数我给的是一个二维的点,不管是Rigdbody2D 还是 Transform.position 都是一样,但是都有一个问题,不准!!!

这就要涉及一些数学问题了,不得不说,数学还是挺有用的,这里面就用到了一些数学知识,首先,我们为什么发射不准呢?我们首先要明白,我们这个2D游戏他是有世界坐标系的,二维的坐标系,那二维坐标系怎么来表示方向呢?向量啊!!!!!我们之所以射击不准,是因为我们给的方向是一个点的坐标,而不是一个方向向量,而且Ruby和发射子弹的坐标位置相对于游戏中的坐标原点是不一样的,因为在不同的参考坐标系中,所以射不准就很正常了,这也就解释了为什么在正方向的时候,它就不影响,因为正方向是当x轴等于0或者是y等于0的时候,所以只有在正方向的时候才准点。

那么我们以发射点为坐标原点记为A(0,0),Ruby的二维坐标为B(X,Y),那么由向量的知识我们知道,我们需要的方向是AB向的,那么就需要B-A=AB;

更新后的代码如下:

    public GameObject Aim;public GameObject BulletPrefab;public float N = 50;bool isAttack = false; //模式1触发private Vector2 RubyVect;private Vector2 AttackVect;float time=0;void Update(){RubyVect.x = Aim.transform.position.x;  //获取目标点的X坐标RubyVect.y = Aim.transform.position.y;  //获取目标点的y坐标AttackVect.x = RubyVect.x - this.transform.position.x; //两坐标相减 得出一个向量 表示方向AttackVect.y = RubyVect.y - this.transform.position.y; //两坐标相减 得出一个向量 表示方向//两个方向向量合并成一个指向Ruby的方向向量if (isAttack){time = time + Time.deltaTime;timer += Time.deltaTime;if(time>=0.25){Launch();time = 0;}}}private void Launch(){GameObject bullet = Instantiate(BulletPrefab, transform.position, Quaternion.identity);  //Quaternion.identity 没有角度 (0,0,0)bullet.GetComponent<bullet>().Lauch(AttackVect, N);  //方向向量✖力}

另外我也查了这个子弹发射的文档,是个矢量,前几天没仔细看,不然也就解决了。在这里插入图片描述
然后大家需要建一个空对象,将空对象绑定到Ruby身上,调节他的位置到Ruby的中心:在这里插入图片描述
在这里插入图片描述

记住将其拖拽个修改后的脚本:
在这里插入图片描述
看一下效果:
在这里插入图片描述
妥妥的不管在哪里都射击到了Ruby的中心,解决了以前的问题!这个还是比较简单的数学问题,后面做东西的时候还会遇到很多类似的问题,包括渲染,角度的计算,所以学好数学很重要!!

芜湖,懂了就点个赞吧O(∩_∩)O哈哈~

这篇关于【Ruby‘s adventure】Unity期末上机考试题目预测与解析(6/17已更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156130

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in