Jump to content
Unity Insider Forum

C# Kamera scrollt in einer Kurve


Tiwaz

Recommended Posts

Problem ist jetzt gelöst. Kann im Titel ggf. geändert werden.

 

Moin moin,

ich bastel grad an einem Script mit der ich die Kamera steuern kann, weil mir SmoothFollow, etc viel zu simpel ist. Außerdem ist es JavaScript und ich will es homogen in C# halten ^^

Das Problem ist, dass wenn ich scrolle die Kamera in einer Kurve nach oben weg bzw. nach unten zum Charakter hin scrollt. (Unten gibt's ne Skizze dazu in der Seitenansicht)

 

 


if (Input.GetMouseButton(1))
		{
			x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
			y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

			if (x > 360 || x < -360)
			{
				x = 0;
			}

			target.Rotate(0, Input.GetAxis("Mouse X") * xSpeed * 0.02f, 0);
		}

		y = ClampAngle(y, yMinLimit, yMaxLimit);
		Quaternion rotation = Quaternion.Euler(y, x, 0);
		Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
		transform.position = position;
		transform.rotation = rotation;

		float wantedRotationAngle = target.eulerAngles.y;
		float wantedHeight = target.position.y + height;

		float currentRotationAngle = transform.eulerAngles.y;
		float currentHeight = transform.position.y;

		// Damp the rotation around the y-axis
		currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, damping * Time.deltaTime);

		// Convert the angle into a rotation
		Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);

		// Set the position of the camera on the x-z plane to:
		// distance meters behind the target
		transform.position = target.position;
		transform.position -= currentRotation * Vector3.forward * distance;

		// Set the height of the camera
		transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);

		currentDistance = Vector3.Distance(target.position, transform.position);

		if (Input.GetAxis("Mouse ScrollWheel") < 0)
		{
			if (distance < maxDistance)
			{
				distance += scrollSpeed;
			}
		}

		if (Input.GetAxis("Mouse ScrollWheel") > 0)
		{
			if (distance > minDistance)
			{
				distance -= scrollSpeed;

			}
		}
transform.LookAt(new Vector3(target.position.x, target.position.y + height, target.position.z));

 

Ich hätt aber gern, dass die Kamera in einer graden Linie wegscrollt.

Bin heute schon den halben Tag am Scripten und jetzt hab ich nich mehr genug Hirnschmalz beisammen, dass ich irgendwie drauf komm wo der Fehler liegt ^^

hab schon total viel ausprobiert aber es funktioniert nix.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ui, alles voller Vektormathematik.

Dabei ist es so einfach, zwei, drei Objekte untereinander zu ordnen, zwei kleine Scripts zu schreiben, die jeweils nur drehen, neigen oder zoomen. Das sind dann jeweils Dreizeiler und wesentlich weniger Hirnkrampf.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab ich jetz mal mit ein paar Parametern und so versucht aber es kommt immer was falsches dabei raus :/

Kenn/kannte die Methode bislang aber auch noch nich und weiß jetz auch nich genau ob das so richtig funktioniert wenn die Kamera kein Parentobjekt hat ^^

 

Note: Es handelt sich um eine Kamera die den Charakter immer verfolgen soll, wenn sich der Charakter also dreht, soll die Kamera so positioniert werden, dass der Spieler auch weiterhin von hinten auf den charakter blickt. Außerdem soll sie, wenn man die rechte Maustaste gedrückt hält, frei bewegbar sein (mit Blick auf den Spieler) und sie darf/sollte kein Childobjekt sein, da ich später noch Elemente einbauen will wo ich die Kamera unabhängig vom Spieler wo anders Positionieren kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du machst einfach folgendes:

  • Oberstes Objekt: Folge dem Spieler. Wiklich nur transform.position = target.position in LateUpdate
    Da die Kamera sich mitdrehen soll, auch noch transform.rotation = target.rotation
  • Darunter: Objekt, dass sich per Input um die Y-Achse dreht. Aber mit localRotation, versteht sich
  • Darunter: Objekt, dass sich per Input neigt, also um die x-Achse dreht
  • Darunter: Die Kamera, mit einem Script, dass localPosition.z per Input ändert

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, hab ich jetz gemacht und funktioniert echt super, vielen Dank :)

 

@edit:

Jetzt klappt alles einwandfrei, hatte immer nen Ruckler bei dem man nen Frame lang ne andere Kameraeinstellung sah, wenn ich während des Laufens die Kamera rotiert und wieder losgelassen habe (die soll dann nämlich wieder hinter den Charakter springen)

Wird wohl daran gelegen haben, dass ich die Rotation des Spielers dabei ebenfalls veränder habe (damit er in die Richtung der Kamera läuft).

 

Auf jeden Fall hab ich jetzt die Rotation beim Obersten Objekt rausgenommen und beim Objekt das für die Y-Achsen Drehung zuständig ist mit reingepackt, falls ich keine Tasten drücke und es geht ^^

 

Aber vielen Dank nochmal für den Denkanstoß ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...