UE风格化Day18-UE强制删除错了/UE预览关卡显示/风格化水材质

在UE5项目中,作者不小心强制删除了模型,导致需要重新创建材质。分享了如何恢复场景并提供了一些UE使用小技巧,如设置关卡和项目缩略图。此外,详细介绍了风格化水材质的制作过程,包括使用水正常贴图和调整材质节点以达到风格化效果。

寄!不小心删掉了模型。。

起因是不知道按到了什么键,把我的资产文件夹复制到了一个新文件夹,然后我就想删除多余的新文件夹,然后弹出来一个正在引用,需要强制删除;因为之前也见过很多次没用过的资产不知道哪里引用了,所以就以为是无关紧要的引用,直接强制删除了——删完就发现炸了。。而且是不能撤回的,这个没有历史的,场景就变成——拔剑四顾心茫然

严重教训:不要强制删除,就算留一堆垃圾也不要挑战强制删除!除非已经复制了工程备份

还好删除的只是自己建的资产,地图的Actor不影响,只能手动替换网格体了,不算完全重做,但是材质是需要重新建的。。只能说还好没什么进度(苦笑),场景也不算复杂,重新弄不算太长时间

学到了几个UE强迫症小技巧:

关卡缩略图展示:可以方便辨认多个关卡

  项目缩略图:未设置时,往往会按照最后保存的缩略图在UE打开面板,手动设置方便打开项目时辨认;也可以

<think>我们使用UE5蓝图实现P5风格的日期系统,重点包括: 1. 日期系统核心:管理当前日期、星期和时间段 2. 固定事件安排:周一到周五白天强制上课,周末自由安排 3. 自由活动选择:每个时段只能选择一项活动,活动后自动跳转时段 4. 场景切换:活动执行时切换到特定场景,活动完成后返回 5. 特殊事件:在特定日期和时间段触发事件 步骤分解: 一、创建日期系统核心(使用GameInstance子系统) 1. 创建GameInstance子系统(例如BP_DateSystemSubsystem): - 存放日期和时间段变量,并提供全局访问方法。 - 变量: - CurrentDate: 结构体(包含年、月、日、星期) - CurrentTimeSegment: 枚举(白天、放学后、夜晚) - CurrentTime: 一天中的时间(小时、分钟,可选) 2. 日期推进逻辑: - 每次活动结束后,自动推进时间(例如,活动消耗时间)。 - 当时间推进到下一个时段时,触发时段切换事件。 3. 枚举定义: - 创建枚举`E_DayPhase`:Morning(白天)、AfterSchool(放学后)、Night(夜晚) 二、固定事件安排 1. 在GameMode中初始化时段: - 游戏开始时,根据当前日期设置时段。 - 如果是周一到周五的白天(Morning),自动触发上课事件(强制)。 2. 上课事件实现: - 创建一个上课事件蓝图(例如BP_ClassEvent),继承自Actor(或使用蓝图接口)。 - 在事件中实现上课逻辑(可以包括场景切换、动画、对话等)。 - 事件结束时,调用日期系统的推进时间方法,并切换到放学后(AfterSchool)时段。 3. 周末处理: - 在GameMode中判断如果是周六或周日,则跳过上课事件,直接进入放学后(AfterSchool)时段(或直接进入白天自由时段,根据设计调整)。 三、自由活动选择 1. 活动菜单: - 创建一个UMG控件蓝图,显示当前时段可用的活动列表。 - 活动列表从日期系统中获取(日期系统根据当前日期和时段从数据表中读取可用活动)。 2. 活动执行: - 当玩家选择一个活动后,触发活动的执行函数。 - 活动执行时,可能需要切换到另一个场景(比如去咖啡馆、图书馆等)。 3. 场景切换: - 使用`Open Level`节点切换到目标场景。 - 在活动场景中,活动结束后调用回调函数返回主场景(如学校或主角房间),并推进时间。 四、自动时段切换 1. 时间推进: - 每个活动都有预设的时间消耗(比如2小时)。 - 活动完成后,调用日期系统的`AdvanceTime`方法,增加相应时间。 - 日期系统检查时间是否达到下一个时段(例如,放学后活动结束,时间超过18:00,则自动切换到夜晚)。 2. 时段切换事件: - 在日期系统中,当时段切换时,广播一个事件(Event Dispatcher)。 - GameMode订阅这个事件,并根据新的时段更新游戏状态(例如,切换到夜晚时,关闭户外活动)。 五、特定日期事件触发 1. 事件数据表: - 创建数据表(DataTable),行结构包含日期(或日期范围)、时间段、事件类。 - 例如:日期“5/1”在放学后时段触发“节日事件”。 2. 事件触发检查: - 每次时段切换时,日期系统检查数据表,看当前日期和时间段是否有特殊事件。 - 如果有,则暂停常规活动,优先执行特殊事件。 3. 事件制作: - 特殊事件制作成独立的蓝图(例如BP_SpecialEvent)。 - 事件可以包括场景切换、序列动画、对话等。 - 事件完成后,同样推进时间并返回。 六、蓝图实现细节 1. 日期系统子系统(BP_DateSystemSubsystem): - 初始化:设置初始日期(如4月1日)和时段(白天)。 - 方法: - `AdvanceTime`:参数为小时数,更新当前时间并检查时段切换。 - `GetCurrentAvailableActivities`:根据当前日期和时段,从数据表获取可用活动。 2. 固定事件(上课)实现流程: - GameMode BeginPlay时,检查当前时段: ```mermaid graph TD A[GameMode BeginPlay] --> B{当前时段是白天?} B -->|是| C{是周一到周五?} C -->|是| D[执行上课事件] C -->|否| E[直接进入放学后时段] B -->|否| F[继续当前时段] ``` 3. 活动执行与场景切换: - 活动蓝图(例如BP_ActivityBase)有一个执行函数: - 保存当前场景信息 - 异步加载目标场景(使用`Open Level`或流加载) - 在目标场景中完成活动 - 活动结束时,异步加载返回原场景,并调用日期系统的`AdvanceTime` 4. 特殊事件触发: - 在日期系统的`AdvanceTime`方法中,当时段切换后,检查特殊事件数据表: ```mermaid sequenceDiagram participant D as BP_DateSystemSubsystem participant G as GameMode D->>D: AdvanceTime调用完成 D->>D: 检查特殊事件 alt 有特殊事件 D->>G: 触发特殊事件 G->>Event: 执行事件 Event->>D: 事件完成,通知日期系统 else 无事件 G: 显示活动菜单 end ``` 七、示例代码段(蓝图节点) 1. 上课事件开始(GameMode中): - 获取日期系统 - 判断星期(使用日期系统的CurrentDate获取星期几) - 如果是周一到周五,生成上课事件actor,并绑定完成事件 2. 上课事件完成时: - 调用日期系统的`AdvanceTime`(推进到放学后,比如推进4小时) - 销毁事件actor 3. 活动菜单中生成活动按钮: - 从日期系统获取当前可用活动列表 - 循环创建按钮,按钮点击时调用活动的执行函数 4. 特殊事件执行(以数据表驱动): - 日期系统在时段切换时,用当前日期和时段作为键查询数据表 - 如果找到事件类,生成这个事件类的实例并执行 八、场景切换具体实现 1. 异步加载场景: - 使用`Async Load Level by Name`节点(在Level Streaming中) - 在加载过程中显示加载界面 - 加载完成后卸载当前场景(或使用流加载保持多个场景) 2. 保持玩家状态: - 玩家控制器和Pawn在切换场景时不被销毁(使用`Persistent`标志) - 或者在切换场景前保存玩家数据,加载新场景后重新生成玩家 九、事件制作 1. 事件蓝图(BP_EventBase): - 事件开始(BeginPlay)时,自动执行事件逻辑(如播放序列、显示对话框) - 事件逻辑结束后,调用完成事件 2. 事件内容: - 可以使用UE5的Sequencer制作过场动画 - 使用蓝图编写交互逻辑(如对话选择) - 事件中可以通过子关卡流式加载特定场景 十、注意事项 1. 日期保存:存档时保存日期系统的状态。 2. 事件冲突:当同时有多个事件满足条件时,设置优先级。 3. 调试:提供控制台命令快速推进时间。 下面我们将分步骤描述具体实现: </think># UE5蓝图实现女神异闻录P5风格日期系统 下面我将详细介绍如何使用UE5蓝图完整实现《女神异闻录P5》风格的日期系统,包括周一到周五固定事件、周末处理、时段管理和事件触发机制。 ## 一、系统架构设计 ```mermaid classDiagram class GameMode{ +InitializeDateSystem() +HandleTimeAdvancement() } class BP_DateSystem{ +CurrentDate: FDateTime +CurrentSegment: ETimeSegment +AdvanceTime(float Hours) +GetAvailableActivities(): TArray<TSubclassOf<UActivityBase>> } class ETimeSegment{ <<enum>> Morning AfterSchool Night } class UActivityBase{ +ExecuteActivity() +CompleteActivity() } class DataTable_Events{ +DateKey: String +ForcedEvent: TSubclassOf<UActivityBase> +AvailableActivities: TArray<TSubclassOf<UActivityBase>> } GameMode --> BP_DateSystem : 使用 BP_DateSystem --> DataTable_Events : 查询 BP_DateSystem --> ETimeSegment : 使用 UActivityBase <|-- BP_ClassEvent : 继承 UActivityBase <|-- BP_SpecialEvent : 继承 ``` ## 二、核心组件实现 ### 1. 日期系统蓝图 (`BP_DateSystem`) - **变量**: - `CurrentDate`: DateTime类型,存储当前日期 - `CurrentSegment`: Enum类型(白天/放学后/夜晚) - `EventDataTable`: 事件配置数据表 - **时间推进函数**: ```mermaid graph TD A[AdvanceTime] --> B{时间推进} B -->|白天时段| C[推进4小时] B -->|放学后| D[推进3小时] B -->|夜晚| E[推进5小时] C --> F[检查时段切换] D --> F E --> F F -->|时间≥18:00| G[切换到夜晚] F -->|时间<12:00| H[保持白天] G --> I[广播时段变更事件] H --> I ``` ### 2. 固定事件处理逻辑 ```blueprint // 在GameMode蓝图中的伪代码实现 BeginPlay: 调用 BP_DateSystem.InitializeDateSystem() Handle Morning Segment: 如果 是周一到周五: 获取 BP_DateSystem.GetForcedEvent() -> BP_ClassEvent 执行 BP_ClassEvent.ExecuteActivity() 否则: // 周末 BP_DateSystem.AdvanceToSegment(AfterSchool) On Activity Complete: BP_DateSystem.AdvanceTime(Activity.TimeCost) ``` ## 三、场景切换实现 ### 1. 活动执行时的场景切换流程 ```mermaid sequenceDiagram participant P as Player participant M as MenuSystem participant D as DateSystem participant L as LevelLoader P->>M: 选择活动 M->>D: 请求执行活动 D->>L: 加载目标场景(异步) L-->>P: 显示加载界面 L->>L: 加载目标场景资源 L->>D: 场景加载完成 D->>Activity: 执行活动逻辑 Activity->>D: 活动完成 D->>L: 返回主场景 L->>D: 场景切换完成 D->>D: AdvanceTime(活动耗时) ``` ### 2. 蓝图实现异步加载 ```blueprint // 在ActivityBase中的异步加载实现 ExecuteActivity: 显示加载界面UI 开始异步加载目标关卡 绑定委托 OnLevelLoaded OnLevelLoaded: 隐藏加载界面 执行具体活动逻辑 ``` ## 四、特定日期事件触发 ### 1. 事件数据表配置 | DateKey | ForcedEvent | AvailableActivities | |------------|-----------------|-------------------------| | Mon | BP_ClassEvent | BP_Library, BP_Cafe | | 2024-05-01 | BP_FestivalEvent| BP_Fireworks, BP_Dinner | ### 2. 事件触发逻辑 ```blueprint // 在BP_DateSystem中 AdvanceTime: // 时间推进后... FString DateKey = CurrentDate.ToString("yyyy-MM-dd"); if (EventDataTable.HasRow(DateKey)) FEventData Row = EventDataTable.FindRow(DateKey) if (Row.Priority > CurrentEventPriority) ExecuteSpecialEvent(Row.ForcedEvent) ``` ### 3. 特殊事件制作 1. **创建事件蓝图** (`BP_SpecialEvent`): - 继承自`UActivityBase` - 实现自定义逻辑序列 2. **事件序列制作**: ```mermaid graph LR A[事件开始] --> B[场景切换] B --> C[播放开场动画] C --> D[显示对话选项] D --> E{玩家选择} E -->|选项1| F[分支剧情1] E -->|选项2| G[分支剧情2] F --> H[播放结局动画] G --> H H --> I[返回主场景] I --> J[事件完成] ``` ## 五、完整流程演示 ```mermaid stateDiagram-v2 [*] --> Morning Morning --> 周一到周五: 是 Morning --> AfterSchool: 周末 周一到周五 --> ClassEvent: 执行上课事件 ClassEvent --> AfterSchool: 事件完成 AfterSchool --> ActivityMenu: 显示活动菜单 ActivityMenu --> SelectedActivity: 选择活动 SelectedActivity --> ActivityExecution: 执行活动 ActivityExecution --> AfterSchool: 活动完成 AfterSchool --> Night: 时间≥18:00 Night --> NightActivityMenu: 显示夜间活动 NightActivityMenu --> NightActivity: 选择活动 NightActivity --> NightActivityExecution: 执行活动 NightActivityExecution --> NextDay: 活动完成 NextDay --> Morning: 日期推进 ``` ## 六、优化技巧 1. **数据驱动设计**: - 所有事件配置在数据表中,便于策划调整 - 使用日期字符串(`yyyy-MM-dd`)和星期(`Mon`)作为键值 2. **资源管理**: ```blueprint // 预加载活动资源 PreloadActivityResources: 获取所有可用活动类 遍历每个活动类: 请求加载活动所需素材 添加到流式加载管理器 ``` 3. **调试支持**: ```blueprint // 控制台命令 ConsoleCommand: SkipTime Hours=4 调用 BP_DateSystem.AdvanceTime(4) ConsoleCommand: SetDate 2024-05-15 调用 BP_DateSystem.SetDate(2024-05-15) ``` 通过此方案,可以实现完整的P5风格日期系统,包括固定事件调度、自由活动选择、场景无缝切换和特殊日期事件触发[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值