Jump to content
Unity Insider Forum

C# Skript (ohne MonoBehaviour) in Unity nutzen


minuschki

Recommended Posts

Hallo Leute

Ich habe das folgende Skript (ein SudokuSolver) aus einem Tutorial abgetippt. Es ist zwar in C# geschrieben, aber nicht für Unity angepasst. Den Inhalt des Skripts verstehe ich soweit, allerdings habe ich keinen blassen Schimmer, was man da ändern muss, damit es auch in Unity zu funktioniert!

Bei den ersten vier Zeilen muss wahrscheinlich überall using Unity.System.... stehen! Da es sich nicht um ein Monobehaviour-Skript handelt, lässt es sich auch nicht auf ein GameObjekt ziehen. Ich habe versucht, aus dem "namespace Sudo" ein "public class Sudo MonoBehaviour" zu machen, aber dann bocken die Zeilen "class Program" und alle "static bool".

Ich habe noch die Erläuterungen von Sascha zum Thema "Statische Variablen und Funktionen" durchgelesen, hat mir aber nicht weitergeholfen.

 

Kann mal jemand zeigen, wie man das Skript umschreiben müsste, damit es in Unity genutzt werden kann?

Vielleicht muss man das ja gar nicht umschreiben, sondern einfach nur aufrufen?! Allerdings hätte ich auch hier keine Ahnung, wie man aus einem MonoBehaviour-Skript das untenstehende Script aufrufen kann und wo dieses denn hin müsste (da es sich ja an kein Gameobjekt anhängen lässt).

 

Besten Dank für eure Hilfe!

 

using System.Collections;
using System.Collections.Generic;
using System.Linq
using System.Text;


namespace Sudo
{

	class Program
	{
		static bool checkZeile(int zeile, int wert, int[,] xox)
		{
			for (int i = 0; i < 9; i++)
			{
				if (xox[i, zeile] == wert) return false;
			}
			return true;
		}


		static bool checkSpalte(int spalte, int wert, int[,] xox)
		{
			for (int i = 0; i < 9; i++)
			{
				if (xox[spalte, i] == wert) return false;
			}
			return true;
		}


		static bool checkBlock(int zeile, int spalte, int wert, int[,] xox)
		{
			for (int i = 0; i < 3; i++)
			{
				if (i == spalte) continue;
				for (int j = 0; j < 3; j++)
				{
					if (j == zeile) continue;
					if (xox [spalte - (spalte % 3) + i, zeile - (zeile % 3) + j] == wert) return false;
				}
			}
			return true;
		}


		static bool checkMove(int zeile, int spalte, int wert, int[,] xox)
		{
			if (!checkZeile (zeile, wert, xox)) return false;
			if (!checkSpalte (zeile, wert, xox)) return false;
			if (!checkBlock (zeile, spalte, wert, xox)) return false;
			return true;
		}


		static int[,] BSudoku(int wert, int px, int py, int[,] field)
		{
			int[,] workerField = new int[9, 9];
			System.Array.Copy (field, workerField, field.Length);
			//for (int i = 0; i < 9; i++)
			//{
			//	for (int j = 0; j < 9; j++)
			//	{
			//		workerField[i, j] = field[j, i];
			//	}
			//}
			workerField [px, py] = wert;

			for (int x = 0; x < 9; x++)
			{
				for (int y = 0; y < 9; y++)
				{
					if (workerField [x, y] == 0)
					{
						for (int val = 1; val <= 9; val++)
						{
							if (checkMove (y, x, val, workerField))
							{
								BSudoku (val, x, y, workerField);
							}
						}
						return null;
					}
				}
			}

			for (int i = 0; i < 9; i++)
			{
				for (int j = 0; j < 9; j++)
				{
					Debug.Log (workerField[i, j]);
				}
				Debug.Log (" ");
			}
			Debug.Log ("--------");
			return workerField;
		}


		static void Main(string[] args)
		{
			int[,] field = new int[9, 9];
			BSudoku (0, 0, 0, field);
		}
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Du kannst natürlich auch Klassen verwenden, die nicht von MB erben. Diese rufst du wie ganz normale Klasse auf. Also Instanz erzeugen und dann hast du Zugriff auf alle public Methoden. Das kannst du natürlich auch innerhalb einer Klasse machen, die von MB erbt und an einem GameObject hängt. Wie genau du die Klasse verwendest, kommt auf die genaue Situation an. Wie hast du die Daten des Sudokus gespeichert usw....

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Antwort! Ich werde zwar leider nicht schlauer daraus, da mir der Umgang mit Skripts ohne MonoBehaviour völlig unbekannt ist.

Wäre es denn nicht das Beste, wenn ich das ganze Skript in ein normales Skript mit MonoBehaviour und voids umschreibe, die ich dann einfach wie gewohnt aufrufen kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Wenn du noch nie mit Klassen gearbeitet hast, die nicht von MB erben, solltest du vielleicht zuerst ein kurzes Tutorial für c# anschauen. Im Grunde ist das aber kein Hexenwerk:

 

class foo : Monobehavior
{
	private TestKlasse _meineTestKlasse = new TestKlasse();

	private void Awake()
	{
		_meineTestKlasse.TestMethode();
	}
}

 

Du kannst also in foo ganz locker mit deiner eigenen Klasse arbeiten.

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...