Prosta konsola 30692 2

O temacie

Autor inż. Avallach

Zaczęty 14.05.2012 roku

Wyświetleń 30692

Odpowiedzi 2

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Prosta konsola
2012-05-14, 17:33(Ostatnia zmiana: 2013-04-24, 21:47)
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.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Konsola przydatna rzecz,ale mam jedną uwagę

Spoiler
eval (display.text);

W zasadzie jedyna linijka potrzebna w całym tutku ^^ . Równie dobrze można by walnąć link do dokumentacji  :lol:

W każdym razie. Ktoś zna odpowiednik eval#msg1035837a w C#? Tj metody, która interpretuje stringa jako polecenie? C# nie jest językiem skryptowym więc pewnie by to nie ruszyło, no ale zapytać zawsze można ;)
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Prosta konsola
#2 2012-06-18, 23:20(Ostatnia zmiana: 2012-06-18, 23:26)
Wiesz, jakbyś tą linijkę gdzieś po prostu dał, to by nic się nie stało :D
Tutek ma na celu głównie pokazanie jak skonstruować interface z polem tekstowym (to nie jest gotowa kontrolka, w skrypcie jest przechwytywanie naciskanych liter na klawiaturze i działanie przycisków backspace, enter i escape).

JScript.NET jest normalnie kompilowany do plików wykonywalnych, ale przy wywołaniu evala specjalnie uruchamia własny parser i wykonuje dany fragment kodu, przez co jest on o wiele wolniejszy niż reszta aplikacji.

W C# jest to niewykonalne, ale sporo można osiągnąć korzystając z refleksji. Sam napisałem sobie "nibyparser" nie korzystający z evala który potrafił wykonywać dowolne funkcje z dowolnymi argumentami czy przypisywać wartości zmiennych. W zasadzie mogę ci go podesłać na pw jeśli jesteś zainteresowany.
Jeśli chodzi ci nie o wywoływanie funkcji czy modyfikowanie zmiennych, ale o operacje matematyczne, to do tego akurat powstały dedykowane biblioteki które dość łatwo znaleźć.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry