Wątek przeniesiony 2020-03-08 22:18 z Newbie przez furious programming.

Gra MMORPG – kilka pytań

1

Wsadziłeś metodę OnCollisionEnter do wnętrza metody Update. Błąd jasno informuje, że funkcje lokalne nie są wspierane w tej wersji C#. Czytaj tę książkę uważnie, a po drugie, czytaj uważnie listę błędów, bo wszystko co źle robisz jest w niej opisane.

0

Furious zrobiłem to samo co jest napisane w książce. Fragment jest w załączniku. Mam rozumieć że korzystam z jakiejś starej wersji języka C#?

1
wojtek1492 napisał(a):

Furious zrobiłem to samo co jest napisane w książce. Fragment jest w załączniku.

No i gdzie na tym zdjęciu napisane jest, że masz OnCollisionEnter umieścić wewnątrz Update?

Mam rozumieć że korzystam z jakiejś starej wersji języka C#?

O tym informuje błąd kompilacji – Ty używasz wersji 4, a lokalne funkcje dostępne są od wersji 7. Ale nie to jest głównym błędem.

0

Tam jest wyraźnie napisane żeby wpisać ten fragment z listing 1.2 tuż po linii void Update () {

co zrobiłem źle?

Robię to od początku. Jeśli teraz nie zrobię dobrze będę szukał dalej.

Udało się, cała "komenda" miała być za "}" a ja dawałem między {} , dlatego nie działało.

0

Unity i C# ciąg dalszy :) Mam sporo pytań i wątpliwości ale może sam dojdę do rozwiązań.

0

Ucz się powoli, na spokojnie.

Staraj się sam rozwiązywać problemy – to się przyda w przyszłości. Zresztą, jak będziesz spamował forum bzdurnymi pytaniami to nikt nie będzie chciał na nie odpowiadać, co najwyżej dostaniesz link do Google, na odczepne. ;)

0

Witam, poszperalem na internecie i jeszcze bardziej utwierdzilem się w przekonaniu że bez C# nie mam co ruszać z miejsca. Znalazlem mase poradników które odpowiadają na moje pytania, jest podany kod na filmiku, wystarczy znać język i samemu można coś podpatrzeć z gotowcow :) Najbardziej martwi mnie oprawa "online" gry ale do tego jeszcze szmat czasu, narazzie podstawy.

2

Aktualnie uczę się C# ze strony mwin.pl :) Nie będę codziennie pisał o tym czego się ucze bo to bez sensu, nic do tematu nie wnosi, pozdrawiam czytających.

0

Rozwiązuję sobie zadania ze strony mwin.pl i mam problem, nie rozumiem pewnych lini w tym kodzie.
Wybaczcie jeśli źle wkleiłem kod, nie robiłem tego nigdy:)

Polecenie do zadania brzmi tak :

Wylosuj 3 liczby i wypisz największą z nich.

Ponizej kod:

using UnityEngine;
using System.Collections;
 
public class Lekcja_02 : MonoBehaviour {
	
	void Start()
	{
		int rndA = Random.Range (0, 20);
		int rndB = Random.Range (0, 20);
		int rndC = Random.Range (0, 20);
		int max = rndA;  // Dlaczego tutaj jest max = rndA a nie np. max = rndB albo rndC ?
 
		if (max < rndB) {
			max = rndB;  // Czy mogę tę linijke przetumaczyć tak : rndA jest równe rndB ? max w tym wypadku to rndA?
		}
 
		if (max < rndC) {
			max = rndC;
		}
		Debug.Log (max);
		Debug.Log (rndA + " - " + rndB + " - " + rndC);  // W tej lini po rndA i rndB mamy znak +, dlaczego znak + jest równiez przed rndB i dlaczego nie ma po rndC?
	}
}
0
wojtek1492 napisał(a):
int max = rndA;  // Dlaczego tutaj jest max = rndA a nie np. max = rndB albo rndC ?

Bo to żadna różnica, jaką wartość na początku przyjmie ta zmienna. Ale jeśli zmienisz rndA na inną, to będziesz musiał także zmienić zmienne w warunkach.

if (max < rndB) {
    max = rndB;  // Czy mogę tę linijke przetumaczyć tak : rndA jest równe rndB ? max w tym wypadku to rndA?

Nie. Ten warunek sprawdza, czy wartość rndB jest większa od bieżącej wartości zmiennej max. Jeśli jest większa to do zmiennej max wpisuje rndB (tak, operator = służy do przypisania, nie do porównania…).

Debug.Log (rndA + " - " + rndB + " - " + rndC);  // W tej lini po rndA i rndB mamy znak +, dlaczego znak + jest równiez przed rndB i dlaczego nie ma po rndC?

Bo wynikiem tej operacji ma być ciąg znaków. Choć dziwię się, że nie ma tam żadnego ToString – skoro działa to widać zachodzi tam niejawna konwersja.

0
  1. Obojętne, którą byś wybrał (oczywiście wybór innej rzutuje na dalszy kod)
  2. To nie "równe" tylko przypisz
  3. Konkatenacja stringów
0

Dziękuje za odpowiedź i pomoc :)
Jak myślicie, lepiej zrobić jedną postać od A do Z i brać się za "programowanie" następnej czy lepiej zrobić 4 postacie i po kolei do każdej animacje, skile, emocje itp? Macie jakieś doświadczenie w tym?

PS. Zamówiłem dziś komputer na x-kom, do końca tygodnia powinien przyjść. Do tego dokupie jakiś monitor 21 cali.

0
wojtek1492 napisał(a):

Jak myślicie, lepiej zrobić jedną postać od A do Z i brać się za "programowanie" następnej czy lepiej zrobić 4 postacie i po kolei do każdej animacje, skile, emocje itp?

IMO nie ma to znaczenia – wszystko zależy od tego, które rozwiązanie będzie dla Ciebie wygodniejsze. Sam raczej skusiłbym się robić daną postać w całości, przy czym pewne rzeczy zostawiłbym na koniec, wtedy gdy wykonuje się ostateczne szlify i spina całość do kupy.

Macie jakieś doświadczenie w tym?

A na co to komu. Wystarczy myśleć logicznie i wiedzieć czego się chce.

Do tego dokupie jakiś monitor 21 cali.

Dodatkowy ekran zawsze się przyda. Jednak z monitorami jest tak, że jak już podłączy się jeden i zobaczy się jak pozwala usprawnić pracę, to chciałoby się ich mieć więcej. Przynajmniej sam tak to widzę – mam jeden dodatkowy, ale wolałbym mieć ze trzy – tyle że laptop nie uciągnie, a i miejsca nie mam za bardzo. ;)

1

W tej chwili pracuje na ekranie 15 calowym w niskiej rozdzielczości, myśle że przesiadka na 21 cali i wyższą rozdzielczość będzie wyraźnie zauważalna i poprawi komfort pracy, po remoncie będzie wiadomo. Martwie się tylko ilością RAM'u bo kupiłem kość 4GB, może 2 tygodnie się przemęczę a potem dokupię.

Co do samego programowania to chyba zrobię tak że będę robił postać od A do Z i wtedy będę brał się za następną, mase skryptów i poradników znalazłem na stronie Unity, wszystko w miarę ładnie opisane ale chcę nauczyć się C# w stopniu chociaż średnim żebym sam wiedział co jest napisane w skryptach i jak to przerobić na swoją wersję.

Jak teraz widzę skrypt to tak jakbym widział chińskie litery, nic nie rozumiem. Najpierw C# a potem reszta, do C# znalazłem 2 serie fajnych poradników na YT do tego C# +Unity również na YT w 2 seriach. Kupiłem w księgarni 3 książki o Unity, o C# nic nie było dla początkujących.

Widzę że masa pracy przede mną na kilka ładnych lat ale nawet jeśli nie uda mi się uruchomić tej gry online to pewnie będę już umiał dobrze obsługiwać Unity, Blendera i będę znał C# w stopniu średniozaawansowanym a wtedy można myśleć coś o zmianie pracy...wiem że to wszystko brzmi jak marzenia 15 latka ale takie mam myślenie, przepraszam za brak polskich znaków.

Pozdrawiam czytających :)

0

Witam, przeglądam sobie Asset Store i trafiłem na filmik prezentujący jeden płatny asset. Czy takie efekty umiejętności można zrobić za pomocą systemu cząsteczek w Unity czy trzeba do tego czegoś więcej ?

1

Nie znam odpowiedzi na Twoje pytanie, ale ostatnio zauważyłem kilka linków do ciekawych stron:

przy czym nie wiem, na ile jest on aktualny. Na nim znalazłem link do takiej strony dotyczącej gier:

Trudno mi ocenić jej przydatność. Patrz też, ile lat temu zostały napisane poszczególne artykuły.
Poza tym na naszym mikroblogu znalazłem taki wpis:

I przy całej ewentualnej "pomocności" tych materiałów uczulam Cię (bo sam mam z tym problem), byś nie skakał z bloga na blog (przynajmniej na początku), tylko trzymał się kilku (nie więcej!) sprawdzonych źródeł.

0
wojtek1492 napisał(a):

Witam, przeglądam sobie Asset Store i trafiłem na filmik prezentujący jeden płatny asset. Czy takie efekty umiejętności można zrobić za pomocą systemu cząsteczek w Unity czy trzeba do tego czegoś więcej ?

Tak, można. A jak tam nauka C#?

0

Dobrze, nadal utrwalam podstawy...próbuje zrozumieć logikę programowania bo wbrew pozorom to jest bardzo mądre i logiczne. W głowie mam miliony pytań, część z nich rozwialem materiałami które znalazłem po angielsku na oficjalnej stronie Unity :)

To wszystko wymaga masy czasu i chęci.

0

Dzień dobry mam kilka pytań dotyczących tego kodu, pytanie umieściłem w kodzie.

using UnityEngine;
using System.Collections;

public class Lekcja_05 : MonoBehaviour {
	
	class Figures {
		
		public double side;
		public double height;
		public double radius;
		public double area;
		public int figType;
		
		public Figures(int f, double a, double h, double r) {
			side = a;     // Znak " = " to jest przypisanie tak? To znaczy że w kolejnych linijkach zamiast pisać słowo "side" możemy użyc litery "a",  dobrze rozumiem?
			height = h;
			radius = r;
			figType = f;
		}
		
		private double countArea()
		{
			switch(figType) {
			case 1:
				// Prostokat
				area = side * height;
				break;
			case 2:
				// Trojkat
				area = side * height * 0.5;
				break;
			case 3:
				// Kolo
				area = 3.14 * radius * radius;
				break;
			}
			return 0;
		}

		public double getArea()
		{
			if (area != null) {
				countArea();
			}
			return area;
		}
	}
	
	void Start()
	{
		Figures f1 = new Figures(1, 3, 2, 0); // Tych 3 linijek kodu nie rozumiem...skąd te cyfry w nawiasie po przecinkach?
		Figures f2 = new Figures(2, 2, 2, 0);
		Figures f3 = new Figures(3, 0, 0, 5);
		
		Debug.Log("Prostokat: " + f1.getArea());  // Tych 3 linjek również nie rozumiem.
		Debug.Log("Trojkat: " + f2.getArea());
		Debug.Log("Kolo: " + f3.getArea());
	}
}

2

// Znak " = " to jest przypisanie tak? To znaczy że w kolejnych linijkach zamiast pisać słowo "side" możemy użyc litery "a", dobrze rozumiem?

Tak, ale odwrotnie. C# ma tzw. zasięg blokowy, więc w całej tej metodzie (tutaj także: konstruktorze; nie poza nim!) można używać słowa (czyli nazwy zmiennej) side zamiast słowa (nazwy zmiennej) a. Samej zmiennej side można używać i poza konstruktorem, ale rozumowanie wygląda wtedy trochę inaczej.

Z tym, że nadawanie zmiennym nazw takich jak a czy h jest niezbyt dobre. Jedyny przypadek to taki, jeśli nazwa ta odpowiada rzeczywistości – np. występuje w jakimś wzorze matematycznym. Jeśli nie, to mamy dwie opcje: 1) kod, w którym występuje, jest krótki i/lub prosty, jak np. teraz Twój konstruktor Figures. Nie będąc Tobą, twórcą kodu, da się zrozumieć, co to a oznacza (no, ostatecznie się da), więc jest mniejszy problem; 2) funkcja jest złożona – wyobraź sobie, gdyby a było wykorzystywane w kodzie w kilku plikach – jeśli zapomniałbyś, co oznacza nazwa zmiennej a, musiałbyś szukać po plikach tego jednego miejsca, w którym jest to wyjaśnione albo przez jej oczywiste użycie, albo przez komentarz, albo przez coś tam, co wyjaśnia, co oznacza ta zmienna. Byłby większy problem. Tak czy siak, w obu wypadkach jest jakiś problem, więc żeby nie robić sobie problemu, najlepszym wyjściem jest unikanie używania takich krótkich i niewiele mówiących nazw.

Figures f1 = new Figures(1, 3, 2, 0); // Tych 3 linijek kodu nie rozumiem...skąd te cyfry w nawiasie po przecinkach?

To wywołanie metody (tutaj także nazywanej konstruktorem). Dokładnie idzie to mniej-więcej tak: program tworzy nową instancję klasy (==obiekt) Figures, korzystając z argumentów 1, 3, 2, 0, a następnie przypisuje tę instancję zmiennej f1. Wywołanie, czyli jakby uruchomienie. Dokładnie, program przechodzi wtedy do pierwszej instrukcji w ciele metody. Pamiętam, jak zaczynałem programować, było to dla mnie dziwne – że co, program miałby sobie skakać tak po kodzie, nawet po kilku plikach? Ano tak, "skacze", a w przypadku wzorców typu MVC jest jeszcze ciekawiej (dla mnie przynajmniej), ale to może na kiedy indziej. ;)

Debug.Log("Prostokat: " + f1.getArea()); // Tych 3 linjek również nie rozumiem.

To zapisanie do logu (nie orientuję się w logach w C#) pola prostokąta. Dokładnie idzie to mniej-więcej tak: program wywołuje metodę getArea() na obiekcie f1, następnie konwertuje jej wynik (bo jest to liczba zmiennoprzecinkowa, czyli ma typ double) do ciągu znaków (typ string), potem łączy ciąg znaków "Prostokąt: " ze skonwertowanym ciągiem, a wyniku połączenia (tak to chyba odbywa się w C#, dokładnie musisz poczytać o operatorze + na ciągach znaków) używa jako argumentu przekazanego do metody Log. Tylko w tym wypadku jest trochę chyba inaczej, niż w wywołaniu metody, które opisałem wyżej, bo wydaje mi się, że metoda Log jest statyczna, ale to jeszcze musisz sprawdzić, nie znam się tak dobrze na C#.

Jeśli coś pomyliłem, proszę bardziej znających C# o doprecyzowanie. :)

0

Silv dziękuję bardzo za to obszerne wyjaśnienie :) Teraz mi się rozjaśnilo.

2
public int figType;

Hmm… ktoś nie zna jeszcze stałych, albo enumów. ;)

Wspominam o tym dlatego, że używasz gołych liczb od 1 do 3, które nie niosą ze sobą informacji o figurach – to tzw. magic numbers. Za tydzień nie będziesz pamiętał o tym, która figura to np. 1. Zamiast liczb, lepiej jest posługiwać się nazwami, bo dzięki nim łatwo zrozumieć co sobą reprezentują.

Przykład dla stałych:

const int Rectangle = 0;
const int Triangle  = 1;
const int Circle    = 2;

Dzięki takim stałym możesz zwiększyć czytelność kodu tworzącego figury:

Figure figure = new Figure(Rectangle, 3, 2, 0);  // od razu widać, że tworzony jest prostokąt

a także zwiększyć czytelność kodu instrukcji wyboru:

private void countArea()
{
  switch(figType) {
    case Rectangle:
      area = side * height;
      break;
    case Triangle:
      area = side * height * 0.5;
      break;
    case Circle:
      area = 3.14 * radius * radius;
      break;
  }
}

Najważniejszą rzeczą związaną ze stałymi jest możliwość używania ich w wielu miejscach kodu oraz zawsze taka sama wartość. Jeśli postanowisz zmienić indeks figury, np. zmienić wartość prostokąta z 0 na 4, to wystarczy zmienić jedną linijkę:

const int Rectangle = 4;

a cała reszta kodu sama się do tej zmiany dostosuje.


W powyższych przykładach co nieco zmieniłem. Pierwsza zmiana to nazwa klasy – Twoja klasa Figures swoją nazwą informuje, że opisuje wiele figur, a w rzeczywistości opisuje tylko jedną. Dlatego nazwę zmieniłem na Figure. Druga zmiana to metoda countArea. Niepotrzebnie zwraca double, skoro i tak wynik ląduje w polu klasy. Dlatego też zmieniłem typ metody na void i usunąłem return.

Sugeruję dla każdego problemu z kodem zakładać osobne wątki – każdy na jeden problem. Natomiast w tym wątku pisać posty tylko wtedy, gdy zechcesz się pochwalić postępami lub coś pokazać. Bo póki co robi się bałagan – jeden wątek do wszystkiego.

0

Uczę się tablic wielowymiarowych i list. Pomocne są poradniki z YT, na filmiku lepiej jest to wyjaśnione niż na suchym tekście w książce. Standardowo mam kilka pytań do Was, będę wdzięczny za każdą odpowiedź.

  1. Czy jeśli robię grę z nastawieniem pod Multiplayer to od początku skrypty dotyczące naprzykład statystyk gracza lub umiejętności, muszą być pisane pod Multiplayer czy można je pisać bez żadnych "dodatków" w kodzie C#?

  2. Do utworzenia systemu umiejętności użyć bazy danych czy ScriptableObjects (chyba że jedno nie wyklucza drugiego)?

  3. Czy macie jakieś materiały lub możecie polecić coś o stworzeniu systemu handlu między graczami? Znalazłem poradniki na temat craftingu, połączenia z serwerem, systemu umiejętności a o systemie handlu nie mogę znaleźć.

  4. Jeśli stworzę skrypty odpowiedzialne za komunikację sieciową między graczami to do jakiego obiektu na scenie mam je dodać? Musi to być na pewno obiekt który jest od początku gry gdy klikniemy ikonę gry na pulpicie. Czy służy do tego jakieś odzielny skrypt który włącza pozostałe gdy gracz uruchamia grę?

Dziękuję za pomoc. Pozdrawiam

0

Kupiłem książkę C# z zadaniami i rozwiązaniami do tego. Nowy komputer śmiga aż miło, chłodzenie muszę wymienić bo straszny hałas na tym BOX'owym :)

Do tworzenia systemu umiejętności i wszystkich itemów w grze chciałbym wykorzystać ScriptableObjects a dane o tym przechowywać w bazie danych, myślicie że to dobre rozwiązanie?

PS. Zapraszam do wypełnienia ankiety oraz rozsyłania jeśli ktoś chciałby pomóc :)

https://www.survio.com/survey/d/D6E9D0X1I4N1S9J8K

PS. Mam problem z wyświetlaniem sceny w Unity...przybiera dziwne kolory, paski z odcieniami jednego koloru.
Od jutra zabieram się za rozpisanie wszystkiego krok po kroku czego użyję i jak będzie wyglądało to wszystko, żebym wiedział co mam programować.

Pozdrawiam

1

U mnie bez większych nowości, dalej zgłębiam wiedzę z zakresu C#. Kupiłem nową książkę i rozpracowuje tablice :)

0

Z jakiej książki się uczysz?

1

Jak postępy? @wojtek1492

1

Wszystko dobrze, na razie uczę się samego C# bez Unity, nie będę wstawiał linijek z kodem który ćwiczę i poprawiam po 10 razy :)

1

Cześć!
Dawno nie robiłeś wpisu coś się zmieniło?

2

Dzień dobry, nie będę wyjaśniał i tłumaczył mojej nieobecności i napisze otwarcie co zamierzam.

Zrezygnowałem z Unity i C# na rzecz Godot i GDScript który ma dużo wspólnego z Pythonem.

Wybór na ten silnik i język programowania padł właśnie głównie ze względu na język programowania w Godot.
Pomyślałem że jeśli nauczę się programować w Pythonie i nie wyjdzie mi w branży gier to Python ma również wiele innych przyszłościowych dziedzin w których jest i (podobno) będzie wykorzystywany jeszcze przez długie lata.

Kupiłem kurs na Udemy, dwie książki i ruszam dalej. Nie porzuciłem moich nierealnych marzeń stworzenia gry MMORPG, jednakże wiem że na pewno nie będzie to tak rozbudowany projekt jak wyobrażałem sobie na początku :)

Czy według Was warto zacząć od modułu PyGame i od gier 2D czy Od razu iść w 3D? Czytałem różne fora/grupy i zdania są podzielone. Według mnie warto byłoby poćwiczyć 2D, z tego względu że nadal jestem początkujący i jeśli nie będę radził sobie z 2D to nie ma sensu zabierać się za 3D.

Gdy opanuje podstawy Pythona/programowania 2D myślę nad kursem na Udemy o tworzeniu gier multiplayer w Unity/Unrealu. Bo pewnie multiplayer działa podobnie na wszystkich silnikach więc może coś zaimplementuje dla siebie:)

Długa droga przedemną ale nie będę się poddawał :)

Edit: Znacie tytuły książek/kursów lub macie jakieś wskazówki o portach TCP/UDP/RPC?
Ponieważ domyślam się że to właśnie na nich cała "multiplayerowa" otoczka wszystkich gier działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1