[C#/Unity] Problem att deklarera lista

Permalänk

[C#/Unity] Problem att deklarera lista

Hej!

Jag håller på att göra ett enkelt turbaserat digitalt spel. Detta programmerar jag i spelmotorn Unity och jag använder c#

Jag har kört fast lite på koden och har ingen att fråga. Tänkte kolla om det är någon här på sweclockers som kan c# programmering i Unity och som skulle kunna svara på några frågor.

Tacksam för svar!

Trådrubriker ska tydligt visa vad tråden handlar om. Undvik även metafrågor - ställ din fråga direkt i tråden. //Mod

Permalänk
Medlem
Skrivet av Hortencya:

Hej!

Jag håller på att göra ett enkelt turbaserat digitalt spel. Detta programmerar jag i spelmotorn Unity och jag använder c#

Jag har kört fast lite på koden och har ingen att fråga. Tänkte kolla om det är någon här på sweclockers som kan c# programmering i Unity och som skulle kunna svara på några frågor.

Tacksam för svar!

Presentera problemet öppet istället.

Permalänk

Hej iXam!

Den här koden ska byta tur mellan två spelare som jag kallar PlayersTurn och CompeutorTurnAI.

Problemet är att Unity inte gillar min definition av variablerna i listan med spelare och jag förstår inte vad felet är.

using UnityEngine;
using System.Collections;
public class Turnmanager : MonoBehaviour {

public Player[] Player()
PlayersTurn PlayersTurn;
CompeutorTurnAI computorturnai;

void Start ()
{
Player = new Player[2];
}
public Player Curplayer;
public void SwitchPlayer()
{
if(Curplayer == Player[0])
Curplayer = Player[1];
else
Curplayer = Player[0];
}

// Update is called once per frame
public void Update () {
if(Input.GetMouseButtonDown(0))
Debug.Log("SwitchPlayer");
}
}

Permalänk
Keeper of Traditions
Skrivet av Hortencya:

Hej iXam!

Den här koden ska byta tur mellan två spelare som jag kallar PlayersTurn och CompeutorTurnAI.

Problemet är att Unity inte gillar min definition av variablerna i listan med spelare och jag förstår inte vad felet är.

using UnityEngine; using System.Collections; public class Turnmanager : MonoBehaviour { public Player[] Player() PlayersTurn PlayersTurn; CompeutorTurnAI computorturnai; void Start () { Player = new Player[2]; } public Player Curplayer; public void SwitchPlayer() { if(Curplayer == Player[0]) Curplayer = Player[1]; else Curplayer = Player[0]; } // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

Omslut kod med Code-taggar så blir det lättare att läsa.

Jag antar att det är rad 5 som felar och den ska skapa en lista antar jag (med namnet Player och typen Player (jobbig namngivning, minst sagt)), men den ser väldigt skum ut.

Brukar man inte göra

List<Player> Player = new List<Player>();

eller är det annorlunda när man använder Unity?

EDIT: Sen bör du nog ändra "Compeutor" till "Computor"... Inte jätteviktigt, men det ser ganska lustigt ut

Visa signatur

|| AMD Ryzen 9800X3D || Asus RTX 4070 TI Super TUF || Samsung 990 PRO 4TB || Kingston Fury CL30 64GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 ||

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Problemet är deklarationen av din array Player.

public Player[] Player()

ska vara

public Player[] Player

Alltså utan paranteser vid variabelnamnet.

Sen kan man ju även tycka att en namnet på en din array borde vara i plural. Alltså Players, eftersom den innehåller mer än en Player

Permalänk

Hej och tusen tack för all hjälp jag har fåt bort de flesta felmeddelandena och nu är det bara ett kvar.
Jag försökte med att ta bort paranterserna () i deklarationen av arrayen men då fick jag ett nytt fel meddeleande av Unity

Felmeddelandet ser ut så här: Assets/c#scripts/Turnmanager.cs(27,14): error CS1525: Unexpected symbol `public'
(Rad 27)

Så här ser koden ut nu är det någon som kan lista ut vad det är för fel nu.

using UnityEngine;
using System.Collections;
public class Turnmanager: MonoBehaviour {

public List<Player> players = new List<Player> ();
PlayersTurn PlayersTurn;
ComputorTurnAI computorturnai;

void Start ()
{
Player = new players[2];
Player = Currentplayer;
}

public void SwitchPlayer()

{
if(Currentplayer == Player[0])
Currentplayer = Player[1];
else
Currentplayer = Player[0];

// Update is called once per frame
public void Update ()
{
if(Input.GetMouseButtonDown(0))
Debug.Log("SwitchPlayer");
}
}

Permalänk
Medlem

Det ser ut som om du saknar en } precis innan public void Update(). Dvs du måste ha en stängande måsvinge efter metoden SwitchPlayer.

Du har 4 st { men bara 3 st }. Använder du [ CODE ]-taggen så blir koden även enklare att läsa. Se exempel nedan:

using UnityEngine; using System.Collections; public class Turnmanager: MonoBehaviour { public List<Player> players = new List<Player> (); PlayersTurn PlayersTurn; ComputorTurnAI computorturnai; void Start () { Player = new players[2]; Player = Currentplayer; } public void SwitchPlayer() { if(Currentplayer == Player[0]) Currentplayer = Player[1]; else Currentplayer = Player[0]; /* OBS: Måsvinge } saknas här */ // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

Permalänk
Medlem

Du måste inludera System.Collections.Generic för att kunna använda List
http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx

Visa signatur
Permalänk

Hej

Jag är jätte tacksamm för all hjälp.

Jag lade till system collection generig till mitt scripts definition så nu har Unity slutat klaga på listan istället klagar Unity på att public står i class deklarartionen. jag skulle bli så tacksam om någon kunde hjälpa mig att lista ut varför.

Felmeddellandet ser ut som följande :Assets/c#scripts/Turnmanager.cs(4,1): error CS1041: Identifier expected: `public' is a keyword.

Här är koden så som den nu ser ut

Citat:

using UnityEngine;
using System.Collections;
using System.Collections.Generic
public class Turnmanager: MonoBehaviour {

public List<Player> players = new List<Player>();
PlayersTurn PlayersTurn;
ComputorTurnAI computorturnai;

void Start ()
{
Player = new players[2];
Player = Currentplayer;
}

public void SwitchPlayer()

{
if (Currentplayer == Player [0])
Currentplayer = Player [1];
else
Currentplayer = Player [0];

}
// Update is called once per frame
public void Update ()
{
if(Input.GetMouseButtonDown(0))
Debug.Log("SwitchPlayer");
}
}

Permalänk
Medlem

Du har glömt ";" -tecken. Vart? jo kolla lite närmre

Visa signatur

Fulburken:
| I9 9900K
| Gigabyte Aorus Z390 AORUS MASTER
| Asus RTX 3090 Strix OC

Permalänk
Medlem
Skrivet av Tickles:

Du har glömt ";" -tecken. Vart? jo kolla lite närmre

Istället för att dryga sig kan du väl bara peka ut var det är han glömt att avsluta raden? Men eftersom inte du kunde ta dig tiden att göra det så gör jag det istället:

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Turnmanager: MonoBehaviour { public List<Player> players = new List<Player>(); PlayersTurn PlayersTurn; ComputorTurnAI computorturnai; void Start () { Player = new players[2]; Player = Currentplayer; } public void SwitchPlayer() { if (Currentplayer == Player [0]) Currentplayer = Player [1]; else Currentplayer = Player [0]; } // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Medlem
Skrivet av RedRetro:

Istället för att dryga sig kan du väl bara peka ut var det är han glömt att avsluta raden? Men eftersom inte du kunde ta dig tiden att göra det så gör jag det istället:

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Turnmanager: MonoBehaviour { public List<Player> players = new List<Player>(); PlayersTurn PlayersTurn; ComputorTurnAI computorturnai; void Start () { Player = new players[2]; Player = Currentplayer; } public void SwitchPlayer() { if (Currentplayer == Player [0]) Currentplayer = Player [1]; else Currentplayer = Player [0]; } // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

Men lilla du. Du kanske ska ta och fundera på varför jag inte bara pekade ut vart. Ska man hålla på med programmering så måste man kunna analysera på egen hand. Det kommer inte sitta personer som gör det åt dig. och om man nu mot förmodan skulle behöva det så lär man ju inte heller få jobb. Ska det vara så svårt att bara på några rader kunna hitta vart man glömt tecknet? Det är ju inte så att det är flera hundra rader kod som hen postade...

Istället för att jag tog mig tiden att göra jobbet åt hen, likt att curla, så ger jag personen chansen att utvecklas...

Visa signatur

Fulburken:
| I9 9900K
| Gigabyte Aorus Z390 AORUS MASTER
| Asus RTX 3090 Strix OC

Permalänk
Medlem

public List<Player> players = new List<Player>();
PlayersTurn PlayersTurn;
ComputorTurnAI computorturnai;

void Start ()
{
Player = new players[2];
Player = Currentplayer;
}

public void SwitchPlayer()

{
if (Currentplayer == Player [0])
Currentplayer = Player [1];
else
Currentplayer = Player [0];
}

verkar som citat inte fungerar för mig, så jag ber om ursäkt.
De du har skrivit, så tolkar jag att Player är en class av något slag.

void Start ()
{
Player = new players[2];
Player = Currentplayer;
}

dessa rader bör du få ett fel på? eftersom du försöker använda Player (som är en class) som en variabel.
Jag tror att du vill göra så här istället

player = new Player[2];
Currentplayer = new Player();

Permalänk

Hej
Tack så mycket för att ni hjälper mig, jag känner att jag verkligen börjar komma frammåt men jag har fortfarande några problem att lösa.
jag hr fixat deklareringen av Player som jag inte längre försöker använda som en variabel utan referer till som en Class istället. Mnu nu klagar Unity på att Currentplayer inte existerar i kontexten och att Player inte kan hanteras i listan av System .Collection. Generic

Jag får följande felmeddelanden
Assets/c#scripts/Turnmanager.cs(12,17): error CS0131: The left-hand side of an assignment must be a variable, a property or an indexer
Assets/c#scripts/Turnmanager.cs(13,17): error CS0103: The name `Currentplayer' does not exist in the current context
Assets/c#scripts/Turnmanager.cs(20,21): error CS0103: The name `Currentplayer' does not exist in the current context
Assets/c#scripts/Turnmanager.cs(21,65): error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected
Assets/c#scripts/Turnmanager.cs(21,49): error CS0103: The name `Currentplayer' does not exist in the current context
Assets/c#scripts/Turnmanager.cs(23,65): error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected
Assets/c#scripts/Turnmanager.cs(23,49): error CS0103: The name `Currentplayer' does not exist in the current context

Mitt program ser ut som följande

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Turnmanager: MonoBehaviour { public List<Player> player = new List<Player>(); PlayersTurn PlayersTurn; ComputorTurnAI computorturnai; void Start () { Player = new Player[2]; Currentplayer = new Player(); } public void SwitchPlayer() { if (Currentplayer == Player [0]) Currentplayer = Player [1]; else Currentplayer = Player [0]; } // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

Jag skulle bli glad om någon kunde hjälpa mig att lösa problemet( jag har försökt att bugga av och kollat syntaxen flera gånger men det verkar inte vara den som är felet)

Använd [code], inte [quote], till kod.
Permalänk
Hedersmedlem
Skrivet av Hortencya:

Mitt program ser ut som följande

Använd [code]-taggar, inte [quote]-taggar, för din kod. Det gör att vitutrymme behålls (dvs främst indrag från vänsterkanten) vilket gör det mycket enklare att läsa för andra.

Jag ändrade åt dig i inlägget ovan så att du kan se själv.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Du borde försöka kolla på en "namnstandard" som fungerar för dig.
Det är inte lämpligt att du namnge dina variabler till Player/PLAYER/player.

Du kommer bara stöta på ännu mer problem i framtiden, så börja direkt att namnge saker och ting på ett mer "korrekt" sätt.

Ett exempel här:

void Start () { Player = new Player[2]; Currentplayer = new Player(); }

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Det verkar som om du inte har definierat vad Currentplayer är för variabel. Om du tittar högre upp i ditt program så ser du följande:
public List<Player> player = new List<Player>();

Det är ju deklarationen av variabeln player. Du måste ha en likadan för Currentplayer också:
public List<Player> Currentplayer = new List<Player>();

Sedan är det ju som NoPain säger ovan att det är ju bara förvirrande att du döpt variabeln till player då du har en klass som heter Player också.

Permalänk
Medlem

Precis som NoPain säger. Bra att tänka på namnstandarder. Tänk även på att försöka ge olika namn till olika saker.

tex:

public List<Player> player = new List<Player>();

Bör istället heta något liknande som:

public List<Player> PlayerList = new List<Player>();

Bara för att göra det enkelt för sig.

Finns dock flera sätt att ange namn till allt men huvudsaken är att man följer en och samma där man kommer att arbeta.

Visa signatur

Fulburken:
| I9 9900K
| Gigabyte Aorus Z390 AORUS MASTER
| Asus RTX 3090 Strix OC

Permalänk

Först vill jag säga att jag är väldigt tacksam för all hjälp som jag fått.

Men jag har tyvärr fortfarande några problem med koden.
Det verkar som om det är något med själva deklarationen av variabeln i den del av koden där jag försökt att deklarera vad CurrentPlayer är.
Min kod ser för tillfället ut så här:

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Turnmanager: MonoBehaviour { public List<Player> PlayerList = new List<Player>(); PlayersTurn PlayersTurn; ComputorTurnAI computorturnai; public List<Player> CurrentPlayer = new List<Player>(); void Start () { Player = new Player[2]; CurrentPlayer = new Player(); } public void SwitchPlayer() { if (CurrentPlayer == Player [0]) CurrentPlayer = Player [1]; else CurrentPlayer = Player [0]; } // Update is called once per frame public void Update () { if(Input.GetMouseButtonDown(0)) Debug.Log("SwitchPlayer"); } }

jag skulle bli jätteglad om någon skulle vilja ge mig lite hjälp.

Permalänk
Medlem

Du hanterar CurrentPlayer som om det vore en instans utav Player, vilket det inte är, det är en lista med Players.
Det som du förmodligen vill är att currentPlayer är just datatypen Player?

Edit: läs på lite basic grejer: datatyper, loops osv

Visa signatur