首页 > 其他分享 >利用结构体存储实体状态——2024TapTap聚光灯GameJam(二)

利用结构体存储实体状态——2024TapTap聚光灯GameJam(二)

时间:2024-11-29 23:44:32浏览次数:3  
标签:GameJam lightMode 状态 提灯 2024TapTap stateSave SaveData 聚光灯 public

利用结构体存储实体状态——2024TapTap聚光灯GameJam(二)


记录日期 2024-11-29           项目时间 2024-10-8           历经时长 21 天

简介

策划要求实现游戏中角色可以扔出手中提灯,并保持扔出前的光线角度、颜色。(可惜最后功能完美实现,但是这个玩法被取消了,没有实际使用到)

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

逻辑

使用结构体保存角度、颜色、灯光类型的数据,再使用单例模式,将脚本挂载在场景中的游戏对象上,这样就可以保证只有一个保存实例,并且便于调用。

对于扔出的灯,我的想法是在原地创建一个预制体,然后读取保存的状态,重新设置灯光。

实现

定义

首先新建脚本SaveData,定义结构体StateSave,这里lightColor是一个颜色的枚举,angle为角度,lightMode是灯光模式:true为光束模式,false为光圈模式,isLight表示灯的开关。

public enum LightColor {  
    white = 0,  
    Red = 1,  
    Blue = 2,  
}
public struct StateSave{  
    public LightColor _color;  
    public float _angle;  
    public bool lightMode; //true:Beam false:circle  
    public bool isLight;  
}

在脚本中声明结构体,并将此脚本设置为单例模式,然后在场景中添加一个空的游戏对象,最后把SaveData脚本挂载在这个游戏对象上。

如此一来当场景运行时就会实例化SaveData,由于在SaveData中声明了结构体,在实例化的时候也会新建一个StateSave对象,且保证了只能有一个SaveData实例。

(由于项目需要,后面我又在这个脚本中加入了一些别的内容,导致上图多出了一些东西,但是实现流程是一样的)

对于扔出的提灯,我首先制作一个提灯的预制体,并将其放在Resources文件夹中便于加载。

然后设置状态机当按下扔出键时进入无灯状态,保存当前灯光数据,关闭自身所有的灯并在原地创建一个提灯,根据读取的灯光数据设置提灯的灯光。

public void ThrowLantern(Transform m_playerBody) {  
     var _lantern =(GameObject)Instantiate(Resources.Load("Lantern(External)"),m_playerBody.transform.position,m_playerBody.transform.rotation);  
     OutPutState(_lantern);  
 }
 private void M_ThrowLantern(Transform m_playerBody) {  
     m_playerController.ThrowLantern(m_playerBody);  
 }
//根据存储的状态设置提灯的状态  
 private void Init() {  
     if (L_stateSave.lightMode) {  
         _lightBeam.gameObject.SetActive(true);  
         _lightCircle.gameObject.SetActive(false);  
         _lightBeam.GetComponent<BeamController>().GetState(L_stateSave);  
     }     else {  
         _lightBeam.gameObject.SetActive(false);  
         _lightCircle.gameObject.SetActive(true);  
         _lightCircle.GetComponent<CircleController>().GetState(L_stateSave);  
     } }

调用

在SaveData中分别定义读取状态和保存状态的方法

public StateSave GetState(StateSave state) {  
    state._angle = m_stateSave._angle;  
    state._color = m_stateSave._color;
    state.lightMode = m_stateSave.lightMode;  
}

public void SaveState(LightColor color, float angle, bool lightMode) {  
    m_stateSave._color = color;  
    m_stateSave._angle = angle;  
    m_stateSave.lightMode = lightMode;  
}

由于使用单例模式,调用时只需

SaveData.Instance.GetState(state);

SaveData.Instance.SaveState();

读取到保存的状态后,再在程序中初始化灯的状态即可,由于我使用的是一个简易的状态机来控制人物有灯和无灯的状态,所以我只需在状态进入和状态退出时分别调用GetState()和SaveState()方法,并在状态进入时初始化灯的状态就可以。

总结

功能虽然完美实现了,但是最后这个机制并没有应用在游戏中(应该是没有合理的方案使角色在扔出提灯解密后将提灯收回)。而且时隔一个月再次审视我的代码,感觉代码的结构还是比较混乱的,优化的空间很大,也算是我经验不足的体现。

对于这个解决方案,我觉得一定有比我这个方案更合理的方法,但是这个方案是我自己构思出来的,因此我感到很有成就感,所以记录下来作为纪念。

项目整体视频演示
项目代码GitHub链接(由于项目后面要配合Shader实现视觉效果,源码可能与上文略有差别)

标签:GameJam,lightMode,状态,提灯,2024TapTap,stateSave,SaveData,聚光灯,public
From: https://www.cnblogs.com/CloverJoyi/p/18577819

相关文章

  • 【游戏开发】记录第一次线下gamejam
    记录第一次线下gamejamciga48h极限开发gamejam本人之前参加过很多线上游戏开发比赛,线下比赛还是第一次。一般大众的普遍认为线下gamejam都是来放松的,感受氛围的那种,来这随便组队,随意一点的那种。(不过我旁边那组就真的是公司来旅游一样挺放松的)但实际不是。。线下群里200号......
  • 聚光灯
    #include<iostream>usingnamespacestd;constintN=109;//定义一个常量N,作为数组的最大尺寸限制charch[N][N];//定义一个二维字符数组,用于存储地图上的字符boolf[N][N];//定义一个二维布尔数组,用于记录哪些位置被访问过intn,m;//定义整数n和m,分......
  • EXCEL C# 聚光灯
    C#EXCEL版本聚光灯,开发框架利用EXCELDNA开源库publicstaticclassExtension{staticApplication_xlapp=(Application)ExcelDnaUtil.Application;publicconststringMyConditionRng="$1:$1048576";[ExcelCommand(MenuName="拓展",Menu......
  • 开源治理·聚光灯| 面对“百家争鸣”的许可证,企业如何做出明智选择?
    本文我们将一同探寻那些常见的开源许可证类型,它们各具特色,有的宽容大度,有的则严格苛刻。同时,我们还将讨论企业在面对许可证问题时,应该如何审时度势,做出明智的选择。毕竟,在这个开源的世界里,只有尊重规则,才能走得更远。在开源许可证中“择婿”“好好先生” MIT/X11许可证MIT/X11许......
  • 记一次体验愉快的GameJam|上交复旦x72h极限游戏开发挑战赛
    太长不看版【上交复旦x72h极限游戏开发挑战赛作品《Colorful》宣传短片】 【腾讯×上交复旦72hgamejam极限游戏开发挑战赛作品《Colorful》全流程演示】 试玩demo下载链接:https://pan.baidu.com/s/1Xdksy97qF8Qac31H6nUGww 提取码:wmuq游戏简介:你说得对,但是《卡乐芙(col......
  • 关于游戏开发及Gamejam的一些尝试
    阅读笔记《01游戏设计》01游戏开发的意义文创意义1.时刻牢记,我们设计的终究是一款游戏,它首先需要对玩家的体验负责。所谓教育意义和弘扬文化只是在游戏体验完善的基础上,和题材风格叠加产生的效果。一开始就抱着“使命感”去设计游戏,反而不会制作出优秀的作品,只有优秀的游戏......
  • 聚光灯
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><linkrel="stylesheet"href="new_file.css"/></head>......
  • 【Unity项目实践】GameJam活动总结——新手做一个完整游戏项目的时候会有什么问题
    前几天参加了Unity的GameJam,作为第一次参加比赛的萌新,不指望能做出什么惊天动地的内容,但是希望能够从中有所收获。现在复盘一下我在游戏项目中用到的一些技巧和Unity知识点,......
  • 校友聚光灯:Ben — 从音乐和音频总监到 CEO 和联合创始人
    校友聚光灯:Ben—从音乐和音频总监到CEO和联合创始人“我最终加入了CodeFellows,这太棒了。六个月的时间里,被其他真正热衷于它的人包围着,我不仅了解了软件世界,它是如......