利用射线检测实现光束照射激活功能——2024TapTap聚光灯GameJam(一)

news/2024/11/5 15:35:46/文章来源:https://www.cnblogs.com/CloverJoyi/p/18528114

利用射线检测实现光束照射激活功能——2024TapTap聚光灯GameJam


记录日期 2024-11-05                          记录时间 13:35
项目完成 2024-10-28                         历经时长 21 天

简介

项目主题:Light

项目名称:《OneLastLight》(2D平台跳跃解密)

我的职责:gamepaly程序,负责实现游戏玩法功能

简述:

策划的设计为角色控制灯光,灯光照射到平台,可以使平台显现实体,玩家可以借助平台解密。

灯光可以被不是平台的实体阻挡,而且灯光不能被平台阻挡,可以穿透平台。

角色有两种形态的灯光,光圈会以玩家为中心形成圆形照亮区域,光束会从玩家开始射出一个扇形区域跟随鼠标探测。

光束有红、蓝、白三种颜色,光圈有红、蓝两种颜色。白色可以使所有平台显现实体,红、蓝光只能令相反颜色的平台显现实体,可以使相同颜色的平台隐藏。

这里记录我实现这个玩法所使用的解决办法。

正文

构想

采用射线检测方法,从角色的位置开始,每次让射线移动一个角度,设置角度限制,使射线检测形成扇形区域,而光圈模式只要将角度限制改为360度

普通的 Physics2D.Raycast只能检测射线碰到的第一个实体,不可穿透,所以这次选择Physics2D.RaycastAll方法,此方法可以返回一个射线上的所有实体从近到远的数组.(Physics2D-RaycastAll - Unity 脚本 API

实现

  1. 创建角色Player,创建两个空物体LightBeam、LightCircle作为Player的子物体image.png
  2. 新建两个脚本:LightBeamController、LightCircleController,分别挂载在:LightBeam、和LightCircle上,脚本内容为构想中RayCastAll方法的实现使用,先获取射线上的所有物体,然后遍历,调用物体上脚本中的激活代码
    LightBeamController(LightCircleControl相似):
//此方法用于实现光线激活平台、阻挡、穿透  
void DrawFieldOfView(){  // 计算最左侧方向的向量// -transform.up看情况设置,最好与LightBeam的旋转一致Vector3 forward_down = Quaternion.Euler(0, 0, -(viewAngle / 2f)) * -transform.up * viewRadius;  //在限制角度内创建viewAngleStep条射线,每条射线偏移一定的角度for (int i = 0; i <= viewAngleStep; i++){  Vector3 v = Quaternion.Euler(0, 0, (viewAngle / viewAngleStep) * i + 180f) * forward_down; // 根据当前角度计算方向向量  Vector3 pos = transform.position + v; // 计算射线终点  // 在Scene中绘制线条(仅在Scene中可见,方便查看)  Debug.DrawLine(transform.position, pos, Color.red);  // 设置射线检测射线 Ray2D ray = new Ray2D(transform.position, v);  //射线检测RaycastHit2D[] hits =  Physics2D.RaycastAll(ray.origin, v, viewRadius, LayerMask.GetMask("Trigger")); //这里设置只检测Trigger层级 //遍历检测到的物体for (int j = 0; j < hits.Length; j++){  RaycastHit2D hitInfo = hits[j];  if (hitInfo.collider != null){  if (hitInfo.collider.CompareTag("BluePlatform") || hitInfo.collider.CompareTag("RedPlatform")){  //检测到为BluePlatform或者RedPlatform执行平台上的显现操作}                               }                }        }    }
}
  1. 射线穿透做完了,现在射线可以穿透所有的物体,为其添加阻挡功能,非常简单。已知Physice2D.RayCastAll方法是将射线碰撞到的所有物体按从近到远的顺序排列在数组中。那么在遍历时遇到不是激活平台的物体直接跳出此次遍历即可,即在判断平台的条件句后加上break即可
if (hitInfo.collider.CompareTag("BluePlatform") || hitInfo.collider.CompareTag("RedPlatform")){  //检测到为BluePlatform或者RedPlatform执行平台上的显现操作}else break;                               }
  1. 制作平台,创建一个空物体叫platform,创建一个矩形叫Entity,给它们挂载碰撞体,将platform的碰撞体设置为trigger,layer层级设置为Trigger(我设置的射线只能检测Trigger层的物体),tag设置为BluePlatform或RedPlatform,最后将Entity作为platform的子物体
    image.png image.png
  2. 创建脚本PlatformController,在脚本中添加BoxAppear()和BoxDisappear()方法,用来控制实体的激活和失活
public void BoxDisappear(){_entity.SetActive(false);}
public void BoxAppear(){_entity.SetActive(true);timer=0;//将计时器置为0}
  1. 在update中添加计时器,在灯光照射时不断将计时器置为0,灯光不照射时计时器开始累计时间,到达一定时长后将平台实体自动失活。
private void Update()  
{  timer += Time.deltaTime;  if (timer > canSeeTime)  {        BoxDisappear();}  
  1. 最后在LightBeamController和LightCircleController中加入灯光颜色判断
if (hitInfo.collider.CompareTag("BluePlatform")||hitInfo.collider.CompareTag("RedPlatform")){  switch (_colorID){  case 0:  if (hitInfo.collider.CompareTag("BluePlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxAppear();  if (hitInfo.collider.CompareTag("RedPlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxDisAppear();  break;  case 1:  if (hitInfo.collider.CompareTag("BluePlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxDisAppear();  if (hitInfo.collider.CompareTag("RedPlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxAppear();  break;  case 2:  if (hitInfo.collider.CompareTag("BluePlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxAppear();  if (hitInfo.collider.CompareTag("RedPlatform"))  hitInfo.collider.gameObject.GetComponent<PlatFormController>().BoxAppear();  break;   }    }       else break;  
}

将射线检测的方法放在UpDate中调用,完成!

其它

光束与光圈模式的切换只需启用对应对象。

光束跟随鼠标,只需要令游戏对象LightBeam跟随鼠标旋转即可。

[项目整体视频演示](【2024TapTap聚光灯作品《OneLastLight》作品展示】 https://www.bilibili.com/video/BV1ipSEYkEx1/?share_source=copy_web&vd_source=5a1c9af9ffce87aadae42c39e82e93f9)
项目代码GitHub链接(由于项目后面要配合Shader实现视觉效果,源码可能与上文略有差别)

总结

这算是我第一次参加GameJam,组队是从官方组队群中组的,比赛过程中学到了很多东西,但与他人的团队协作体验比较差。

队伍有9个人,两程序两美术5策划,策划基本都是完全没有经验,每次开会固定5人:两策划,两程序,主美。其它三人完全没有交流过,也有可能他们与开会来的两策划是同一个学校的,他们会线下交流。但是他们交流的内容不会即时的传递给我们,有时候就会发现他们又策划了什么新功能,但是没有告诉程序和美术。

策划是完全没有经验的,其中一个策划要求我等他写程序需求,然后按照程序需求开发,结果写了两天就写了五条需求,而且很笼统,约等于没有写。关卡体量也过于庞大了,美术有很大压力。然后21天的gamejam唯一一个测试版本是距离ddl还有两个小时做出来的,导致游戏有很多影响体验的小问题。(我一直催促出测试版测试,但策划貌似更热衷于添加新功能)

我也有一些不足的地方,我虽然能够实现游戏程序逻辑,但我没有与他人合作的经验,不擅长留接口给Shader、UI、音乐音效等。

总的来说开发的过程还是很有意思的,从查找、设计解决问题的方法到实际解决给了我很大成就感。现在的我依然喜欢玩游戏,比以前更喜欢开发游戏了。我会继续学习,持续进步。

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

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

相关文章

【救急手册】API挂了如何应对...淘宝...京东...1688...诸如此类

电商API在跑任务的路上可能会跌个大跟头。诸如淘宝、京东、1688等可能是它自己的问题(服务器错误),也可能是我们给的指令不对(客户端错误),又或者是网络在作怪。不管是哪种,我们的目标都是一样的:尽快解决问题,恢复正常。今天,我们来聊聊那些在数字世界中默默工作的英…

html属性

HTML 属性属性是 HTML 元素提供的附加信息。 属性总是以 name="value" 的形式写在标签内,name 是属性的名称,value 是属性的值。HTML 属性HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name=…

实验8:适配器模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解适配器模式的动机,掌握该模式的结构; 2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器 实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。 实验要求: 1.画出对应的类图; 2.提交…

实验7:单例模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解单例模式的动机,掌握该模式的结构; 2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一 仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。 实验要求: 1.画出对应的类图; 2.提交源…

黑马PM-电商项目-售后管理

售后场景构建售后流程分析交易纠纷处理

基于surging 的木舟平台如何通过HTTP网络组件接入设备

一、概述上篇文章介绍了木舟如何上传模块热部署,那么此篇文章将介绍如何利用HTTP网络组件接入设备,那么有些人会问木舟又是什么,是什么架构为基础,能做什么呢?木舟 (Kayak) 是什么?木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和…

易基因: RNA-BS揭示动物不同发育阶段的mRNA m5C甲基化图谱和调控机制|Nat Commun

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 m5C是已知的RNA修饰之一,但其在mRNA中的发育动态、功能和进化仍然知之甚少。最初报道m5C在mRNA中普遍存在,但后来认识到许多最初被鉴定的位点可能假阳性。准确和系统地检测转录组范围mRNA m5C水平一直具有挑…

硬件设计布线原则

1. 高速电流不应流经低速器件 高速电路的地返回信号也会造成地平面的电压发生变 化。对于地平面或接地走线的感抗,V = Ldi/dt ;对于地平面或接地走线的阻抗,V = RI 。与数字电流一样,高 速电路的地平面或接地走线经过模拟器件时,地线上的电压变化会改变信 号链中信号和地之…