채팅 추가

This commit is contained in:
2026-09-01 14:40:02 +09:00
parent cab0d772b1
commit a5a1f1d9e9
50 changed files with 3843 additions and 1124 deletions

View File

@@ -45,6 +45,10 @@ public class DesktopPlatformScanner : MonoBehaviour
[Tooltip("비우면 씬에서 탐색")]
[SerializeField] TransparentWindow window;
// minPlatformWidth 는 빌드에서만, editorFloorY 는 에디터에서만 쓰인다.
// 반대쪽 변형에서는 "할당했지만 안 씀" 경고가 뜬다.
#pragma warning disable 0414
[Header("스캔")]
[Tooltip("창 목록을 다시 훑는 주기(초). 매 프레임 돌 필요가 없다")]
[SerializeField] float scanInterval = 0.25f;
@@ -55,6 +59,12 @@ public class DesktopPlatformScanner : MonoBehaviour
[Tooltip("작업 영역 바닥(작업표시줄 위)을 항상 발판으로 포함한다")]
[SerializeField] bool includeFloor = true;
[Tooltip("에디터에서 쓸 바닥 높이(화면 좌표, 0 이 맨 아래). " +
"빌드에서는 작업표시줄 위를 직접 찾으므로 이 값을 쓰지 않는다")]
[SerializeField] float editorFloorY = 0f;
#pragma warning restore 0414
readonly List<DesktopPlatform> platforms = new List<DesktopPlatform>();
float nextScanTime;
@@ -97,6 +107,26 @@ public bool TryFindPlatformBelow(float x, float y, float tolerance, out DesktopP
return any;
}
/// <summary>
/// 화면 좌표로 바닥 발판 하나를 직접 만든다. 창 목록에서 바닥을 얻지 못했을 때의 보루.
///
/// 바닥이 하나도 없으면 캐릭터가 끝없이 떨어지다 화면 가운데로 되돌아오기를
/// 반복한다(WindowClimber.TickFalling). 그 상태로는 아무것도 확인할 수 없다.
/// </summary>
void AddScreenFloor(float y, string title)
{
platforms.Add(new DesktopPlatform
{
Y = y,
XMin = 0f,
XMax = Screen.width,
Title = title,
IsFloor = true,
Hwnd = System.IntPtr.Zero,
WindowLeft = 0f,
});
}
#if !UNITY_EDITOR && UNITY_STANDALONE_WIN
// EnumWindows 콜백은 네이티브가 호출하므로 GC 되지 않게 붙잡아 둔다.
@@ -223,12 +253,18 @@ static void Subtract(List<(float a, float b)> segments, float cutA, float cutB)
void AddFloor(DesktopCursor.Mapping map)
{
// 작업 영역은 작업표시줄을 제외한 범위다. 그 바닥에 서면 작업표시줄 위에 선다.
if (!Win32.SystemParametersInfoW(Win32.SPI_GETWORKAREA, 0, out Win32.RECT work, 0)) return;
if (Win32.SystemParametersInfoW(Win32.SPI_GETWORKAREA, 0, out Win32.RECT work, 0) &&
AddPlatform(map, work.left, work.right, work.bottom, "바닥", true, IntPtr.Zero, work.left))
{
return;
}
AddPlatform(map, work.left, work.right, work.bottom, "바닥", true, IntPtr.Zero, work.left);
// 작업 영역을 못 구했거나 화면 밖으로 잘려나갔을 때. 바닥 없이 두면 안 된다.
AddScreenFloor(0f, "바닥(대체)");
}
void AddPlatform(DesktopCursor.Mapping map, float desktopLeft, float desktopRight,
/// <returns>실제로 발판이 추가됐는지. 너무 좁거나 화면 밖이면 false.</returns>
bool AddPlatform(DesktopCursor.Mapping map, float desktopLeft, float desktopRight,
float desktopTop, string title, bool isFloor,
IntPtr hwnd, float desktopWindowLeft)
{
@@ -239,8 +275,8 @@ void AddFloor(DesktopCursor.Mapping map)
// 화면 밖으로 벗어난 부분은 잘라낸다.
xMin = Mathf.Max(xMin, 0f);
xMax = Mathf.Min(xMax, Screen.width);
if (xMax - xMin < minPlatformWidth) return;
if (y < 0f || y > Screen.height) return;
if (xMax - xMin < minPlatformWidth) return false;
if (y < 0f || y > Screen.height) return false;
platforms.Add(new DesktopPlatform
{
@@ -252,12 +288,22 @@ void AddFloor(DesktopCursor.Mapping map)
Hwnd = hwnd,
WindowLeft = map.ToScreenX(desktopWindowLeft),
});
return true;
}
#else
/// <summary>
/// 에디터에는 열거할 창이 없다. 그래서 발판이 하나도 없고, 캐릭터는 끝없이
/// 떨어졌다가 화면 가운데로 되돌아오기를 반복한다.
///
/// 빌드에서 작업표시줄이 해주던 역할을 대신할 바닥 하나만 깔아준다.
/// 창에 올라타는 동작 자체는 여전히 빌드에서만 확인할 수 있다.
/// </summary>
void Scan()
{
// 에디터에서는 창 열거를 하지 않는다. 빌드해서 확인할 것.
platforms.Clear();
if (includeFloor) AddScreenFloor(editorFloorY, "바닥(에디터)");
Rescanned?.Invoke();
}
#endif
}