'Invalid token '=' in class, struct, or interface member declaration.' error with two lines in a unity script

Viewed 163

I am having an issue with this error that keeps on appearing with the lines that mention : spriteRenderer = GetComponent<SpriteRenderer>(); and selectable = GetComponent<Selectable>();

The error message that is displayed from my unity engine is

'Invalid token '=' in class, struct, or interface member declaration.'

The problem seems to be around the equal symbols in these lines and I don't understand what the issue is with it. Could I possibly get any advice on this please?

void Start()
{
    List<string> deck = Solitaire.GenerateDeck();
    solitaire = FindObjectOfType<Solitaire>();

    int i = 0;
    foreach (string card in deck)
    {
        cardFace = solitaire.cardFaces[i];
        break;
    }
    i++;
}
spriteRenderer = GetComponent<SpriteRenderer>();
selectable = GetComponent<Selectable>();

// Update is called once per frame
void Update()
{
    if (selectable.faceUp == true)
    {
        spriteRenderer.sprite = cardFace;
    }
    else
    {
        spriteRenderer.sprite = cardBack;
    }
}
1 Answers

It looks like you're creating two objects which will be used in your class'es methods. You need to create a field for that in your class (C# is a strongly typed language, and you need to explain the compiler what you're trying to achieve). In case of local variables you can use the var keyword, but for the fields you need to declare the full type, like this:

private SpriteRenderer _spriteRenderer = GetComponent<SpriteRenderer>();
private Selectable _selectable = GetComponent<Selectable>();

However, better solution will be to move this inside your function Update:

// Update is called once per frame
void Update()
{
    var spriteRenderer = GetComponent<SpriteRenderer>();
    var selectable = GetComponent<Selectable>();

    if (selectable.faceUp == true)
    {
        spriteRenderer.sprite = cardFace;
    }
    else
    {
        spriteRenderer.sprite = cardBack;
    }
}

Also you remove comparing with true:

// Update is called once per frame
void Update()
{
    var spriteRenderer = GetComponent<SpriteRenderer>();
    var selectable = GetComponent<Selectable>();

    if (selectable.faceUp)
    {
        spriteRenderer.sprite = cardFace;
    }
    else
    {
        spriteRenderer.sprite = cardBack;
    }
}

Or, using ternary operator

// Update is called once per frame
void Update()
{
    var spriteRenderer = GetComponent<SpriteRenderer>();
    var selectable = GetComponent<Selectable>();
    spriteRenderer.sprite = selectable.faceUp ? cardFace : cardBack;
}
Related