W trakcie tworzenia i testów gry nierzadko zachodzi potrzeba wykonania jakiejś funkcji. Można z góry, w jej kodzie zdefiniować np wykonanie jej po wciśnięciu wybranego przycisku na klawiaturze. Jest to jednak rozwiązanie użyteczne tylko w pewnych okolicznościach i ogólnie bardzo ograniczone.
O wiele lepszym rozwiązaniem są pojawiające się w niektórych grach konsole - pola tekstowe na ekranie, gdzie można wpisywać polecenia do wykonania przez silnik gry. W projektach które tworzę na Unity też sobie takie zrobiłem.
Korzysta ona tylko z jednej, ale cudownej (i zarazem straszliwie niewłaściwej i niebezpiecznej w większości zastosowań) funkcji eval. Dzięki niej zamiast wklepywać z góry określone polecenia z gotowej listy jak to jest zwykle w grach, możemy wpisywać w nią po prostu kod w JScript.NET, a on zostanie wykonany. Można w ten sposób choćby modyfikować pola obiektów czy wywoływać funkcje.
Spoiler
class CONSOLE extends MonoBehaviour //by Avallach
{
var display : GUIText;
var background : GUITexture;
function Start () : void
{
transform.position = Vector3 (0.0, 1.0, 0.0); //lewy górny róg ekranu
transform.localScale = Vector3 (0.0, 0.0, 0.0);
display = gameObject.AddComponent(GUIText);
display.enabled = false;
background = gameObject.AddComponent(GUITexture);
background.texture = new Texture2D (1, 1);
background.color = Color (0.0, 0.0, 0.0, 0.3);
background.pixelInset = Rect (0, -20, 5000, 20);
background.enabled = false;
};
function Update () : void
{
if (display.enabled)
{
if (Input.inputString == "\b" && display.text.Length > 0)
{ display.text = display.text.Substring(0, display.text.Length - 1); }
else
{ display.text += Input.inputString; }
if (Input.GetKeyDown (KeyCode.Return))
{
eval (display.text);
display.text = "";
};
if (Input.GetKeyDown(KeyCode.F2))
{
display.enabled = false;
background.enabled = false;
};
}
else if (Input.GetKeyDown(KeyCode.F2))
{
display.enabled = true;
background.enabled = true;
};
};
};
Ta tutaj ma bardzo prosty interface - F2 wyświetla ją w formie paska na górze ekranu, w którym możemy wtedy pisać i usuwać tekst, a wciśnięcie enter go wykonuje. Oczywiście wpisanie nieprawidłowego kodu powoduje błąd.
Dla zainteresowanych - na własny użytek posiadam o wiele bardziej rozbudowaną wersję, która nad linijką do wpisywania posiada kilka innych, w których przewijają się komunikaty debugowania (analogiczne do zSpy w Gothicu) i są wyświetlane efekty wpisywanych poleceń.
Konsola została napisana jako komponent (kod jest oparty o MonoBehaviour) - żeby ją włączyć, należy przeciągnąć w edytorze jej skrypt (najlepiej nazwać go CONSOLE.js) na nowy, pusty GameObject (na przykład zrobić sześcian i wywalić jego renderer).
Aha, i byłbym zapomniał - zauważyłem że na nowych wersjach Unity (3.5+) nie działa funkcja eval, piszą też o tym ludzie w Internecie. Znalazłem jednak przypadkiem kompletnie szalony, totalnie dziwaczny sposób naprawienia jej. Jakby był ktoś chętny go przetestować (jest tak głupi że nie chcę nawet o nim pisać publicznie zanim go ktoś inny nie sprawdzi), zapraszam na gg/pw.