sea-battle/Assets/Scripts/BlinkController.cs

516 lines
20 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class BlinkController
{
// Èíòåðâàë ìèãàíèÿ ïî óìîë÷àíèþ (â ñåêóíäàõ)
public static float DefaultInterval = 0.5f;
// Âíóòðåííèé ðàííåð äëÿ çàïóñêà êîðóòèí (äèíàìè÷åñêè ñîçäà¸òñÿ ïðè ïåðâîì èñïîëüçîâàíèè)
private class Runner : MonoBehaviour {
// Ïðè âûõîäå èç ïðèëîæåíèÿ âûêëþ÷àåì âñå ïîäñâåòêè
private void OnApplicationQuit()
{
BlinkController.TurnAllOff();
}
}
private static Runner _runner;
// Õðàíèëèùå çàïóùåííûõ êîðóòèí: êëþ÷ ôîðìèðóåì êàê "A_1" (òèï_èãðîê)
private static readonly Dictionary<string, Coroutine> _coroutines = new Dictionary<string, Coroutine>();
// Óáåäèìñÿ, ÷òî ðàííåð ñóùåñòâóåò è æèâ¸ò íà ñöåíå
private static void EnsureRunner()
{
if (_runner != null) return;
var go = new GameObject("_BlinkControllerRunner");
Object.DontDestroyOnLoad(go);
_runner = go.AddComponent<Runner>();
go.hideFlags = HideFlags.HideAndDontSave;
}
// ---- Àäðåñíûå êîìàíäû äëÿ ïîäñâåòîê A è B (ïî èãðîêó) ----
public static void LightAOn(int playerId) => ComWrapper.Send("2171", playerId);
public static void LightAOff(int playerId) => ComWrapper.Send("2170", playerId);
public static void LightBOn(int playerId) => ComWrapper.Send("2131", playerId);
public static void LightBOff(int playerId) => ComWrapper.Send("2130", playerId);
// ---- Ãëîáàëüíàÿ ïîäñâåòêà C (broadcast) ----
public static void LightCOn() => ComWrapper.Send("401");
public static void LightCOff() => ComWrapper.Send("400");
// ---- Àäðåñíûå LED äèîäû (êîìàíäû 8xxx) ----
// 81õõ - êàíàë 1, 82õõ - êàíàë 2, 83õõ - êàíàë 3, 84õõ - êàíàë 4
// 80õõ - âñå êàíàëû ñðàçó
// Ïðîãðàììû: 0-None, 1-Repeat, 2-Off, 3-Red, 4-Green, 5-Blue, 6-Gray, 7-White, 9-Rainbow, 10+-Custom
/// <summary>Óñòàíîâèòü ïðîãðàììó íà êàíàëå LED (1-4) äëÿ êîíêðåòíîãî èãðîêà</summary>
public static void SetLEDChannel(int channel, int program, int playerId)
{
if (channel < 1 || channel > 4)
{
Debug.LogWarning($"BlinkController: Íåâåðíûé êàíàë LED {channel}. Äîïóñòèìî 1-4");
return;
}
if (program < 0 || program > 99)
{
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
return;
}
string cmd = $"{80 + channel}{program:D2}";
ComWrapper.Send(cmd, playerId);
Debug.Log($"BlinkController: LED êàíàë {channel} -> ïðîãðàììà {program} äëÿ èãðîêà {playerId} (cmd: {cmd})");
}
/// <summary>Óñòàíîâèòü ïðîãðàììó íà âñåõ LED êàíàëàõ äëÿ êîíêðåòíîãî èãðîêà</summary>
public static void SetLEDAll(int program, int playerId)
{
if (program < 0 || program > 99)
{
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
return;
}
string cmd = $"80{program:D2}";
ComWrapper.Send(cmd, playerId);
Debug.Log($"BlinkController: LED âñå êàíàëû -> ïðîãðàììà {program} äëÿ èãðîêà {playerId} (cmd: {cmd})");
}
/// <summary>Óñòàíîâèòü ïðîãðàììó íà âñåõ LED êàíàëàõ ãëîáàëüíî (broadcast)</summary>
public static void SetLEDAllGlobal(int program)
{
if (program < 0 || program > 99)
{
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
return;
}
string cmd = $"80{program:D2}";
ComWrapper.Send(cmd);
Debug.Log($"BlinkController: LED âñå êàíàëû -> ïðîãðàììà {program} ãëîáàëüíî (cmd: {cmd})");
}
// Áûñòðûå êîìàíäû äëÿ LED (àäðåñíûå äëÿ èãðîêà)
public static void LEDOff(int channel, int playerId) => SetLEDChannel(channel, 2, playerId); // Ïîãàñèòü êàíàë
public static void LEDRed(int channel, int playerId) => SetLEDChannel(channel, 3, playerId); // Êðàñíûé
public static void LEDGreen(int channel, int playerId) => SetLEDChannel(channel, 4, playerId); // Çåëåíûé
public static void LEDBlue(int channel, int playerId) => SetLEDChannel(channel, 5, playerId); // Ñèíèé
public static void LEDWhite(int channel, int playerId) => SetLEDChannel(channel, 7, playerId); // Áåëûé
public static void LEDRainbow(int channel, int playerId) => SetLEDChannel(channel, 9, playerId); // Ðàäóãà
public static void LEDWave(int channel, int playerId) => SetLEDChannel(channel, 11, playerId); // âîëíà
public static void LEDOffAll(int playerId) => SetLEDAll(2, playerId); // Ïîãàñèòü âñå äëÿ èãðîêà
public static void LEDRedAll(int playerId) => SetLEDAll(3, playerId); // Êðàñíûé íà âñåõ äëÿ èãðîêà
public static void LEDGreenAll(int playerId) => SetLEDAll(4, playerId); // Çåëåíûé íà âñåõ äëÿ èãðîêà
public static void LEDBlueAll(int playerId) => SetLEDAll(5, playerId); // Ñèíèé íà âñåõ äëÿ èãðîêà
public static void LEDWhiteAll(int playerId) => SetLEDAll(7, playerId); // Áåëûé íà âñåõ äëÿ èãðîêà
public static void LEDRainbowAll(int playerId) => SetLEDAll(9, playerId); // Ðàäóãà íà âñåõ äëÿ èãðîêà
// Ãëîáàëüíûå êîìàíäû (broadcast äëÿ âñåõ èãðîêîâ)
public static void LEDOffAllGlobal() => SetLEDAllGlobal(2); // Ïîãàñèòü âñå ãëîáàëüíî
public static void LEDRedAllGlobal() => SetLEDAllGlobal(3); // Êðàñíûé íà âñåõ ãëîáàëüíî
public static void LEDGreenAllGlobal() => SetLEDAllGlobal(4); // Çåëåíûé íà âñåõ ãëîáàëüíî
public static void LEDBlueAllGlobal() => SetLEDAllGlobal(5); // Ñèíèé íà âñåõ ãëîáàëüíî
public static void LEDWhiteAllGlobal() => SetLEDAllGlobal(7); // Áåëûé íà âñåõ ãëîáàëüíî
public static void LEDRainbowAllGlobal() => SetLEDAllGlobal(9); // Ðàäóãà íà âñåõ ãëîáàëüíî
// ---- Ïåðåêëþ÷åíèå öâåòîâîãî ÷åðåäîâàíèÿ (êîìàíäû 89x) ----
public enum ColorSequence
{
RGB = 0, // 890 - Red, Green, Blue
RBG = 1, // 891 - Red, Blue, Green
BRG = 2, // 892 - Blue, Red, Green
BGR = 3, // 893 - Blue, Green, Red
GRB = 4, // 894 - Green, Red, Blue
GBR = 5 // 895 - Green, Blue, Red
}
/// <summary>Óñòàíîâèòü öâåòîâîå ÷åðåäîâàíèå. Åñëè playerId = 0 èëè íå óêàçàí - îòïðàâêà ãëîáàëüíî</summary>
public static void SetColorSequence(ColorSequence sequence, int playerId = 0)
{
string cmd = $"89{(int)sequence}";
if (playerId > 0)
{
ComWrapper.Send(cmd, playerId);
Debug.Log($"BlinkController: Öâåòîâîå ÷åðåäîâàíèå {sequence} äëÿ èãðîêà {playerId} (cmd: {cmd})");
}
else
{
ComWrapper.Send(cmd);
Debug.Log($"BlinkController: Öâåòîâîå ÷åðåäîâàíèå {sequence} ãëîáàëüíî (cmd: {cmd})");
}
}
// ---- Ïðîèçâîëüíûé RGB öâåò (êîìàíäà 08RRRGGGBBB) ----
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò äëÿ LED. Åñëè playerId = 0 - îòïðàâêà ãëîáàëüíî</summary>
/// <param name="r">Êðàñíûé êàíàë (0-255)</param>
/// <param name="g">Çåëåíûé êàíàë (0-255)</param>
/// <param name="b">Ñèíèé êàíàë (0-255)</param>
/// <param name="playerId">ID èãðîêà (0 = ãëîáàëüíî)</param>
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò íà êîíêðåòíûé êàíàë (81-84)</summary>
public static void SetLEDChannelCustomColor(int channel, int r, int g, int b, int playerId = 0)
{
// Îãðàíè÷èâàåì çíà÷åíèÿ
channel = Mathf.Clamp(channel, 81, 84);
r = Mathf.Clamp(r, 0, 255);
g = Mathf.Clamp(g, 0, 255);
b = Mathf.Clamp(b, 0, 255);
// Ôîðìàò: 8X (êàíàë) + 08 (ïðîãðàììà ïðîèçâîëüíûé öâåò) + RRRGGGBBB
string cmd = $"{channel}08{r:D3}{g:D3}{b:D3}";
if (playerId > 0)
{
ComWrapper.Send(cmd, playerId);
Debug.Log($"BlinkController: LED êàíàë {channel} ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) äëÿ èãðîêà {playerId} (cmd: {cmd})");
}
else
{
ComWrapper.Send(cmd);
Debug.Log($"BlinkController: LED êàíàë {channel} ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) ãëîáàëüíî (cmd: {cmd})");
}
}
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò íà âñå êàíàëû (80)</summary>
public static void SetLEDCustomColor(int r, int g, int b, int playerId = 0)
{
// Îãðàíè÷èâàåì çíà÷åíèÿ 0-255
r = Mathf.Clamp(r, 0, 255);
g = Mathf.Clamp(g, 0, 255);
b = Mathf.Clamp(b, 0, 255);
// Ôîðìàò: 80 (âñå êàíàëû) + 08 (ïðîãðàììà ïðîèçâîëüíûé öâåò) + RRRGGGBBB
string cmd = $"8008{r:D3}{g:D3}{b:D3}";
if (playerId > 0)
{
ComWrapper.Send(cmd, playerId);
Debug.Log($"BlinkController: LED ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) äëÿ èãðîêà {playerId} (cmd: {cmd})");
}
else
{
ComWrapper.Send(cmd);
Debug.Log($"BlinkController: LED ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) ãëîáàëüíî (cmd: {cmd})");
}
}
// Ïðåäóñòàíîâëåííûå öâåòà
public static void LEDGold(int playerId = 0) => SetLEDCustomColor(255, 215, 0, playerId); // Çîëîòîé
public static void LEDOrange(int playerId = 0) => SetLEDCustomColor(255, 165, 0, playerId); // Îðàíæåâûé
public static void LEDPurple(int playerId = 0) => SetLEDCustomColor(128, 0, 128, playerId); // Ôèîëåòîâûé
public static void LEDPink(int playerId = 0) => SetLEDCustomColor(255, 192, 203, playerId); // Ðîçîâûé
public static void LEDCyan(int playerId = 0) => SetLEDCustomColor(0, 255, 255, playerId); // Ãîëóáîé
public static void LEDYellow(int playerId = 0) => SetLEDCustomColor(255, 255, 0, playerId); // Æåëòûé
// ---- Ìèãàíèå LED ñ âîçâðàòîì ê áàçîâîìó öâåòó ----
private static readonly Dictionary<int, int> _playerBaseLEDColor = new Dictionary<int, int>();
// Õðàíèì êàñòîìíûå RGB öâåòà äëÿ êàæäîãî èãðîêà (åñëè óñòàíîâëåí)
private static readonly Dictionary<int, Vector3Int> _playerCustomLEDColor = new Dictionary<int, Vector3Int>();
/// <summary>Óñòàíîâèòü áàçîâûé öâåò LED äëÿ èãðîêà (ê êîòîðîìó âîçâðàùàåìñÿ ïîñëå ìèãàíèÿ)</summary>
public static void SetLEDBaseColor(int playerId, int program)
{
_playerBaseLEDColor[playerId] = program;
_playerCustomLEDColor.Remove(playerId); // Óáèðàåì êàñòîìíûé öâåò
SetLEDAll(program, playerId);
Debug.Log($"BlinkController: Áàçîâûé LED öâåò äëÿ èãðîêà {playerId} óñòàíîâëåí: {program}");
}
/// <summary>Óñòàíîâèòü áàçîâûé êàñòîìíûé RGB öâåò LED äëÿ èãðîêà</summary>
public static void SetLEDBaseCustomColor(int playerId, int r, int g, int b)
{
_playerBaseLEDColor[playerId] = -1; // Ìàðêåð êàñòîìíîãî öâåòà
_playerCustomLEDColor[playerId] = new Vector3Int(r, g, b);
SetLEDCustomColor(r, g, b, playerId);
Debug.Log($"BlinkController: Áàçîâûé êàñòîìíûé LED öâåò äëÿ èãðîêà {playerId} óñòàíîâëåí: RGB({r},{g},{b})");
}
/// <summary>Ïîëó÷èòü áàçîâûé öâåò LED äëÿ èãðîêà</summary>
public static int GetLEDBaseColor(int playerId)
{
return _playerBaseLEDColor.TryGetValue(playerId, out int color) ? color : 5; // Ïî óìîë÷àíèþ ñèíèé (5)
}
/// <summary>Âîññòàíîâèòü áàçîâûé öâåò LED äëÿ èãðîêà (âêëþ÷àÿ êàñòîìíûå RGB)</summary>
public static void RestoreLEDBaseColor(int playerId)
{
if (_playerCustomLEDColor.TryGetValue(playerId, out Vector3Int rgb))
{
// Âîññòàíàâëèâàåì êàñòîìíûé öâåò
SetLEDCustomColor(rgb.x, rgb.y, rgb.z, playerId);
}
else
{
// Âîññòàíàâëèâàåì îáû÷íûé öâåò ïî ïðîãðàììå
int baseColor = GetLEDBaseColor(playerId);
SetLEDAll(baseColor, playerId);
}
}
/// <summary>Ìèãàíèå LED N ðàç öâåòîì, çàòåì âîçâðàò ê áàçîâîìó öâåòó</summary>
public static void BlinkLED(int playerId, int colorProgram, int times, float interval = 0.3f)
{
EnsureRunner();
_runner.StartCoroutine(BlinkLEDRoutine(playerId, colorProgram, times, interval));
}
private static IEnumerator BlinkLEDRoutine(int playerId, int colorProgram, int times, float interval)
{
for (int i = 0; i < times; i++)
{
// Âêëþ÷èòü öâåò
SetLEDAll(colorProgram, playerId);
yield return new WaitForSeconds(interval);
// Âåðíóòü áàçîâûé öâåò (âêëþ÷àÿ êàñòîìíûå RGB)
RestoreLEDBaseColor(playerId);
// Ïàóçà ìåæäó ìèãàíèÿìè (êðîìå ïîñëåäíåãî)
if (i < times - 1)
yield return new WaitForSeconds(interval);
}
}
// Áûñòðûå êîìàíäû ìèãàíèÿ
public static void BlinkLEDRed(int playerId, int times = 1, float interval = 0.3f)
=> BlinkLED(playerId, 3, times, interval);
public static void BlinkLEDGreen(int playerId, int times = 1, float interval = 0.3f)
=> BlinkLED(playerId, 4, times, interval);
public static void BlinkLEDBlue(int playerId, int times = 1, float interval = 0.3f)
=> BlinkLED(playerId, 5, times, interval);
// ---- Start/Stop ìèãàíèÿ ----
public static void StartBlinkA(int playerId, float interval = -1f)
{
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
StartBlinkATimes(playerId, -1, interval);
}
// Ìèãàíèå N ðàç (N <= 0 = áåñêîíå÷íî)
public static void StartBlinkATimes(int playerId, int times, float interval = -1f)
{
StopBlinkA(playerId);
EnsureRunner();
string key = KeyFor("A", playerId);
var coro = _runner.StartCoroutine(BlinkRoutinePlayer(key, playerId, "2170", "2171", interval > 0 ? interval : DefaultInterval, times));
_coroutines[key] = coro;
}
public static void StopBlinkA(int playerId)
{
string key = KeyFor("A", playerId);
StopAndRemove(key);
LightAOff(playerId);
}
public static void StartBlinkB(int playerId, float interval = -1f)
{
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
StartBlinkBTimes(playerId, -1, interval);
}
// Ìèãàíèå N ðàç (N <= 0 = áåñêîíå÷íî)
public static void StartBlinkBTimes(int playerId, int times, float interval = -1f)
{
StopBlinkB(playerId);
EnsureRunner();
string key = KeyFor("B", playerId);
var coro = _runner.StartCoroutine(BlinkRoutinePlayer(key, playerId, "2130", "2131", interval > 0 ? interval : DefaultInterval, times));
_coroutines[key] = coro;
}
public static void StopBlinkB(int playerId)
{
string key = KeyFor("B", playerId);
StopAndRemove(key);
LightBOff(playerId);
}
// Ãëîáàëüíàÿ C
public static void StartBlinkC(float interval = -1f)
{
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
StartBlinkCTimes(-1, interval);
}
// Ìèãàíèå N ðàç ãëîáàëüíî (N <= 0 = áåñêîíå÷íî)
public static void StartBlinkCTimes(int times, float interval = -1f)
{
StopBlinkC();
EnsureRunner();
string key = KeyFor("C", 0);
var coro = _runner.StartCoroutine(BlinkRoutineGlobal(key, "400", "401", interval > 0 ? interval : DefaultInterval, times));
_coroutines[key] = coro;
}
public static void StopBlinkC()
{
string key = KeyFor("C", 0);
StopAndRemove(key);
LightCOff();
}
private static void StopAndRemove(string key)
{
if (_coroutines.TryGetValue(key, out Coroutine c))
{
if (_runner != null && c != null) _runner.StopCoroutine(c);
_coroutines.Remove(key);
}
}
private static string KeyFor(string type, int playerId) => $"{type}_{playerId}";
private static IEnumerator BlinkRoutinePlayer(string key, int playerId, string onCmd, string offCmd, float interval, int repeatCount)
{
// repeatCount <= 0 => áåñêîíå÷íî
if (repeatCount <= 0)
{
while (true)
{
ComWrapper.Send(onCmd, playerId);
yield return new WaitForSeconds(interval);
ComWrapper.Send(offCmd, playerId);
yield return new WaitForSeconds(interval);
}
}
// Ïîâòîðÿåì çàäàííîå êîëè÷åñòâî ðàç
for (int i = 0; i < repeatCount; i++)
{
ComWrapper.Send(onCmd, playerId);
yield return new WaitForSeconds(interval);
ComWrapper.Send(offCmd, playerId);
// Ìåæäó èòåðàöèÿìè äåëàåì ïàóçó, êàê â îáû÷íîì ìèãàíèè, êðîìå ïîñëåäíåé
if (i < repeatCount - 1) yield return new WaitForSeconds(interval);
}
// Ãàðàíòèðóåì, ÷òî êîìàíäà âûêëþ÷åíèÿ ïîñëàíà
ComWrapper.Send(offCmd, playerId);
// Óäàëÿåì çàïèñü î êîðóòèíå
try { _coroutines.Remove(key); } catch { }
}
private static IEnumerator BlinkRoutineGlobal(string key, string onCmd, string offCmd, float interval, int repeatCount)
{
if (repeatCount <= 0)
{
while (true)
{
ComWrapper.Send(onCmd);
yield return new WaitForSeconds(interval);
ComWrapper.Send(offCmd);
yield return new WaitForSeconds(interval);
}
}
for (int i = 0; i < repeatCount; i++)
{
ComWrapper.Send(onCmd);
yield return new WaitForSeconds(interval);
ComWrapper.Send(offCmd);
if (i < repeatCount - 1) yield return new WaitForSeconds(interval);
}
ComWrapper.Send(offCmd);
try { _coroutines.Remove(key); } catch { }
}
// Âñïîìîãàòåëüíûå: ìãíîâåííûé âêë/âûêë âñåõ
public static void StopAll()
{
var keys = new List<string>(_coroutines.Keys);
foreach (var k in keys) StopAndRemove(k);
}
// Âêëþ÷èòü âñå ïîäñâåòêè (A è B — äëÿ îáîèõ èãðîêîâ, C — ãëîáàëüíî)
public static void TurnAllOn()
{
Debug.Log("BlinkController: TurnAllOn");
// A è B àäðåñíûå — äëÿ èãðîêîâ 1 è 2
LightAOn(1);
LightAOn(2);
LightBOn(1);
LightBOn(2);
// C — ãëîáàëüíî
LightCOn();
// LED - ïðè ñòàðòå: êàíàë 1 âîëíà, êàíàë 2 ðàäóãà äëÿ îáîèõ èãðîêîâ
LEDWave(1, 1); // Èãðîê 1: êàíàë 1 -> âîëíà
LEDRainbow(2, 1); // Èãðîê 1: êàíàë 2 -> ðàäóãà
LEDWave(1, 2); // Èãðîê 2: êàíàë 1 -> âîëíà
LEDRainbow(2, 2); // Èãðîê 2: êàíàë 2 -> ðàäóãà
// Óñòàíàâëèâàåì áàçîâûé öâåò - ðàäóãà (äëÿ ìèãàíèÿ áóäåò âîçâðàò ê íåé)
_playerBaseLEDColor[1] = 9;
_playerBaseLEDColor[2] = 9;
}
// Âûêëþ÷èòü âñå ïîäñâåòêè (è îñòàíîâèòü êîðóòèíû)
public static void TurnAllOff()
{
Debug.Log("BlinkController: TurnAllOff");
// Îñòàíîâèì âñå ìèãàíèÿ
StopAll();
// Îòïðàâèì êîìàíäû âûêëþ÷åíèÿ àäðåñíî äëÿ èãðîêîâ 1 è 2
try
{
LightAOff(1);
LightAOff(2);
LightBOff(1);
LightBOff(2);
// C — ãëîáàëüíî
LightCOff();
// LED - âûêëþ÷èòü âñå êàíàëû ãëîáàëüíî
LEDOffAllGlobal();
}
catch (System.Exception e)
{
Debug.LogWarning($"BlinkController: îøèáêà ïðè TurnAllOff: {e.Message}");
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void OnRuntimeInitialized()
{
// Ïîäïèñûâàåìñÿ íà ñîáûòèå èíèöèàëèçàöèè ComWrapper — âêëþ÷èì ïîäñâåòêè, êîãäà COM áóäåò ãîòîâ
try
{
ComWrapper.OnInitialize += TurnAllOn;
// Ïîäïèñûâàåìñÿ, ÷òîáû âûêëþ÷èòü ïîäñâåòêè ÄÎ çàêðûòèÿ ïîðòîâ
ComWrapper.OnBeforeClose += TurnAllOff;
}
catch
{
// Åñëè ComWrapper åù¸ íå ñóùåñòâóåò èëè íå îïðåäåë¸í, ïðîèãíîðèðóåì — âûçîâ ïðîèçîéä¸ò ïðè èíèöèàëèçàöèè
}
// Ñîçäà¸ì ðàííåð çàðàíåå, ÷òîáû îí áûë äîñòóïåí è ãàðàíòèðîâàííî ñóùåñòâîâàë
EnsureRunner();
// Ïîäïèøåìñÿ íà ñîáûòèå âûõîäà ïðèëîæåíèÿ — ãàðàíòèðîâàííî âûêëþ÷èò ïîäñâåòêè è ïî÷èñòèò ïîäïèñêè
Application.quitting += OnApplicationQuitting;
}
// Îáðàáîò÷èê âûõîäà ïðèëîæåíèÿ: îòïèñûâàåìñÿ îò ñîáûòèé ComWrapper
private static void OnApplicationQuitting()
{
try { ComWrapper.OnInitialize -= TurnAllOn; } catch { }
try { ComWrapper.OnBeforeClose -= TurnAllOff; } catch { }
try { TurnAllOff(); } catch { }
if (_runner != null)
{
Object.Destroy(_runner.gameObject);
_runner = null;
}
}
}