I need help: Type or namespace definition, or end-of-file expected

Hello, everyone! I am trying to make a working piano, but it seems like there is something wrong with brackets. Can someone help me please? Thanks in advance!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Keyboard : MonoBehaviour
{
    public GameObject blackTile, whiteTile;
    public GameObject content;

    public int numberOfOctaves;
    // Start is called before the first frame update
    void Start()
    {
        int startNote = 24;
        for (int i = 0; i < numberOfOctaves; i++)
        {
            createOctave(startNote + i * 12, i);
        }
    }


    private void createOctave(int startNote, int octave)
    {
        float width = content.GetComponent<RectTransform>().rect.width;
        float widthPerOctave = width / numberOfOctaves;
        float widthPerNote = widthPerOctave / 7;

        // 7 white tiles
        for (int i = 0; i < 7; i++)
        {
            int actualNoteIndex = getWhiteKeyIndex(i);
            GameObject note = instantiateNote(whiteTile, actualNoteIndex, startNote);
            registerEvent(note);

            note.GetComponent<RectTransform>().sizeDelta = new Vector2(widthPerNote - 1, note.GetComponent<RectTransform>().sizeDelta.y);
            note.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(widthPerOctave * octave + widthPerNote * i + widthPerNote / 2, -whiteTile.GetComponent<RectTransform>().rect.height / 2, 0);
        }

        // 5 black tiles
        for (int i = 0; i < 5; i++)
        {
            int actualNoteIndex = getBlackKeyIndex(i);
            GameObject note = instantiateNote(blackTile, actualNoteIndex, startNote);
            registerEvent(note);

            note.GetComponent<RectTransform>().sizeDelta = new Vector2(widthPerNote / 2, note.GetComponent<RectTransform>().sizeDelta.y);

            int BlackIndex = i;
            if (i > 1)
            {
                blackIndex += 1;
            }
            note.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(widthPerOctave * octave + widthPerNote * BlackIndex + widthPerNote, -blackTile.GetComponent<RectTransform>().rect.height / 2, 0);
        }
    }
   
    }

    private void registerEvents(GameObject note)
    {
    EventTrigger trigger = note.gameObject.AddComponent<EventTrigger>();
    var pointerDown = new EventTrigger.Entry();
    pointerDown.eventID = EventTriggerType.PointerDown;
    pointerDown.callback.AddListener((e) => keyOn(note.GetComponent<PianoTile>().midiNote));
    trigger.triggers.Add(pointerDown);

    var pointerUp = new EventTrigger.Entry();
    pointerUp.eventID = EventTriggerType.PointerUp;
    pointerUp.callback.AddListener((e) => keyOff(note.GetComponent<PianoTile>().midiNote));
    trigger.triggers.Add(pointerUp);
    }

    public void keyOn(int midiNumber)
    {
    Debug.Log("Clicked " + midiNumber);
    }

    public void keyOff(int midiNumber)
    {
    Debug.Log("Released " + midiNumber);
    }

    private GameObject instantiateNote(GameObject note, int actualIndexNote, int startNote)
    {
    GameObject newNote = instantiate(note);
    newNote.transform.SetParent(content.transform, false);
    newNote.GetComponent<PianoTile>().midiNote = startNote + actualIndexNote;
    return newNote;
    }

    private int getWhiteKeyIndex(int i)
    {
    // C
    int actualNoteIndex = 0;

    if (i == 1)
    {
        // D
        actualNoteIndex = 2;
    }
    else if (i == 2)
    {
        // E
        actualNoteIndex = 4;
    }
    else if (i == 3)
    {
        // F
        actualNoteIndex = 5;
    }
    else if (i == 4)
    {
        // G
        actualNoteIndex = 7;
    }
    else if (i == 5)
    {
        // A
        actualNoteIndex = 9;
    }
    else if (i == 6)
    {
        // B
        actualNoteIndex = 11;
    }
    return actualNoteIndex;
    }

    // Update is called once per frame

    void Update()
    {

    }

}

Just make sure that for every open bracket you have a closed bracket. Couldn’t be easier.

Even without counting myself I can see an odd bracket on line 58 that just looks out of place.

1 Like

but this makes only more problems, I still cannot run the game

it logically cannot let me run the game if I remove that bracket in row 58

I never said it would. Read what I said above, the brackets need to match. That’s the only issue you posted and matching bracket is the solution to that issue.

You likely have even more problems beyond this.

1 Like

Because you have tons of typos and you should be able to fix them yourself. The compiler tells you when it doesn’t recognise something. When that’s the case you most likely have spelt it wrong… For example

  • line 34 you used registerEvent while your method is named registerEvents
  • line 43 you tried to call a method named getBlackKeyIndex which simply doesn’t exist at all
  • line 45 again registerEvent
  • line 52 you typed blackIndex while the variable which you declared 3 lines above is named BlackIndex
  • line 86 you wrote instantiate instead of Instantiate

And those may just be some of your errors. You have to learn to actually read the errors. ALWAYS start with the first error. Don’t even think about errors further down the line as they could be caused by the first one. Look at the line where the error is reported. The issue is in 99% of the cases either in that very line or ABOVE that line. Of course naming issues has to be solved by yourself. Things that come with the framework needs to be named correctly. Note that casing matters. So Black, black and bLAcK are all 3 completely different things. When you name your own stuff, make sure you name it the same everywhere. Otherwise you’re not talking about the same thing. Compilers don’t guess, they need 100% correct code.

2 Likes

okay, sorry for that.

i am a begginer, but I will make sure, that this wont happen in other scripts.

2 Likes

We all start somewhere, keep at it but for sure the advice above is good!

BTW, a good forum you can use initially is: https://forum.unity.com/forums/getting-started.82/

1 Like

Thank you, I will check it out!

1 Like

You actually need to do more than that. That is only Step #1. Step #2 is the important step.

Don’t skip Step #2 below or else you are completely wasting your time here.

Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

How to do tutorials properly, two (2) simple steps to success:

Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That’s how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.
Fortunately this is the easiest part to get right: Be a robot. Don’t make any mistakes.
BE PERFECT IN EVERYTHING YOU DO HERE!!

If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there’s an error, you will NEVER be the first guy to find it.

Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!

Finally, when you have errors, don’t post here… just go fix your errors! Here’s how:

Remember: NOBODY here memorizes error codes. That’s not a thing. The error code is absolutely the least useful part of the error. It serves no purpose at all. Forget the error code. Put it out of your mind.

The complete error message contains everything you need to know to fix the error yourself.

The important parts of the error message are:

  • the description of the error itself (google this; you are NEVER the first one!)
  • the file it occurred in (critical!)
  • the line number and character position (the two numbers in parentheses)
  • also possibly useful is the stack trace (all the lines of text in the lower console window)

Always start with the FIRST error in the console window, as sometimes that error causes or compounds some or all of the subsequent errors. Often the error will be immediately prior to the indicated line, so make sure to check there as well.

Look in the documentation. Every API you attempt to use is probably documented somewhere. Are you using it correctly? Are you spelling it correctly?

All of that information is in the actual error message and you must pay attention to it. Learn how to identify it instantly so you don’t have to stop your progress and fiddle around with the forum.