This commit is contained in:
2026-04-30 21:46:37 +07:00
parent 30d914d3a5
commit 3a553379ec
3 changed files with 69 additions and 11 deletions

View File

@@ -1 +1,21 @@
No previous session history found for this workspace.
# Technical Summary - HALLUCINATE Project
## Overview
Project HALLUCINATE is a Unity-based multiplayer game utilizing **Photon Fusion** for networking and **UI Toolkit** for front-end management. Recent development has concentrated on the core networking infrastructure and the lobby system.
## Modified Files
- `Assets/Scripts/Network/BasicSpawner.cs`: Centralized `NetworkRunner` management, handling session creation, joining, and player profile initialization.
- `Assets/Scripts/UI/LobbyController.cs`: UI logic for room management, password protection, and lounge interactions.
- `Assets/Scripts/Player Controller/PlayerStateMachine.cs`: Core player logic (referenced in memory).
## Key Logic & Decisions
- **Network Architecture**: Singleton `BasicSpawner` manages the Fusion runner lifecycle. Session joining uses `SessionLobby.ClientServer`.
- **UI Architecture**: `LobbyController` inherits from a base UI class and uses direct `VisualElement` queries for dynamic UI updates (UXML/USS).
- **Security**: Implementation of session passwords via custom properties in Photon sessions.
- **State Sync**: Player status (Ready/Start) and lounge info are synchronized between clients, likely via `PlayerDataManager`.
## Next Steps
- [ ] Verify RPC/SyncVar logic in `LobbyController.cs`.
- [ ] Connect `PlayerStateMachine` to the spawning flow in `BasicSpawner`.
- [ ] Implement/Finalize the chat system within the lobby lounge.
- [ ] Ensure all scene transitions (Main Scene) are robust.

View File

@@ -7,6 +7,7 @@ using System;
using System.Threading.Tasks;
using OnlyScove.Scripts;
using Hallucinate.Audio;
using PrimeTween;
namespace Hallucinate.UI
{
@@ -26,6 +27,7 @@ namespace Hallucinate.UI
// Hover Tracking for Arrow Key Slider Control
private Slider _hoveredSlider;
private Action<float> _hoveredOnChanged;
private float _sliderMin, _sliderMax;
// Osu-style Volume Overlay
@@ -103,10 +105,30 @@ namespace Hallucinate.UI
private void OnMouseWheel(WheelEvent evt)
{
// Osu style: Volume control with scroll wheel
// Only control master if not hovering a specific sound slider
if (_activeTab == "SOUND" && _hoveredSlider != null) return;
// Only apply if in the SOUND tab
if (_activeTab != "SOUND") return;
UpdateMasterVolume(-evt.delta.y * 2f);
if (_hoveredSlider != null)
{
// Adjust the hovered slider's value
float currentVal = _hoveredSlider.value;
// Determine step size: default to 1% of range, adjusted for 0-100 range.
float step = (_sliderMax - _sliderMin) / 100f;
float newVal = Mathf.Clamp(currentVal - (evt.delta.y * step * 5f), _sliderMin, _sliderMax); // Multiply by a factor to make scroll smoother
_hoveredSlider.value = newVal;
// Trigger the associated OnValueChanged callback to save PlayerPrefs etc.
_hoveredOnChanged?.Invoke(newVal);
evt.StopPropagation(); // Consume the event so it doesn't affect other elements
}
else
{
// If not hovering a specific slider, control Master Volume
UpdateMasterVolume(-evt.delta.y * 2f);
evt.StopPropagation(); // Consume the event
}
}
private void UpdateMasterVolume(float delta)
@@ -169,7 +191,9 @@ namespace Hallucinate.UI
_content.Add(CreateSection("ACCOUNT"));
string username = PlayerPrefs.GetString("Username", "Guest");
var userRow = new VisualElement { style = { flexDirection = FlexDirection.Row, alignItems = Align.Center, marginBottom = 10 } };
userRow.Add(new Label("Logged in as: ") { className = "text-body" });
var loggedInLabel = new Label("Logged in as: ");
loggedInLabel.AddToClassList("text-body");
userRow.Add(loggedInLabel);
userRow.Add(new Label(username) { style = { color = Color.cyan, marginLeft = 5, unityFontStyleAndWeight = FontStyle.Bold } });
_content.Add(userRow);
@@ -185,7 +209,9 @@ namespace Hallucinate.UI
_content.Add(CreateSection("UPDATES"));
var versionBox = new VisualElement { style = { flexDirection = FlexDirection.Row, alignItems = Align.Center } };
versionBox.Add(new Label($"Version: {Application.version}") { className = "text-body" });
var versionLabel = new Label($"Version: {Application.version}");
versionLabel.AddToClassList("text-body");
versionBox.Add(versionLabel);
var checkBtn = new Button { text = "CHECK FOR UPDATES" };
checkBtn.AddToClassList("button-spring");
checkBtn.clicked += () => checkBtn.text = "UP TO DATE";
@@ -287,7 +313,9 @@ namespace Hallucinate.UI
private void RenderControlTab()
{
_content.Add(CreateSection("KEY BINDINGS"));
_content.Add(new Label("Controls Implementation Pending context.") { className = "text-body" });
var pendingLabel = new Label("Controls Implementation Pending context.");
pendingLabel.AddToClassList("text-body");
_content.Add(pendingLabel);
}
#endregion
@@ -309,8 +337,18 @@ namespace Hallucinate.UI
var input = new TextField { value = startVal.ToString("F1"), style = { width = 50, marginLeft = 10 } };
input.AddToClassList("input-field");
slider.RegisterCallback<PointerEnterEvent>(evt => { _hoveredSlider = slider; _sliderMin = min; _sliderMax = max; });
slider.RegisterCallback<PointerLeaveEvent>(evt => { if (_hoveredSlider == slider) _hoveredSlider = null; });
slider.RegisterCallback<PointerEnterEvent>(evt => {
_hoveredSlider = slider;
_hoveredOnChanged = OnValueChanged;
_sliderMin = min;
_sliderMax = max;
});
slider.RegisterCallback<PointerLeaveEvent>(evt => {
if (_hoveredSlider == slider) {
_hoveredSlider = null;
_hoveredOnChanged = null;
}
});
slider.RegisterValueChangedCallback(evt => {
float val = Mathf.Round(evt.newValue * 10f) / 10f;
@@ -352,12 +390,12 @@ namespace Hallucinate.UI
{
root.style.display = DisplayStyle.Flex;
_sidebar.style.translate = new StyleTranslate(new Translate(Length.Percent(-100), 0));
await Tween.Custom(-100f, 0f, duration: 0.4f, ease: Ease.OutQuad, val => _sidebar.style.translate = new StyleTranslate(new Translate(Length.Percent(val), 0)));
await Tween.Custom(-100f, 0f, duration: 0.4f, ease: Ease.OutQuad, onValueChange: val => _sidebar.style.translate = new StyleTranslate(new Translate(Length.Percent(val), 0)));
}
public override async Task PlayTransitionOut()
{
await Tween.Custom(0f, -100f, duration: 0.3f, ease: Ease.InQuad, val => _sidebar.style.translate = new StyleTranslate(new Translate(Length.Percent(val), 0)));
await Tween.Custom(0f, -100f, duration: 0.3f, ease: Ease.InQuad, onValueChange: val => _sidebar.style.translate = new StyleTranslate(new Translate(Length.Percent(val), 0)));
Hide();
}
}