Jump to content
Unity Insider Forum

[C# Scripting] Rotation der Spielerkamera setzen, wenn auf sie ein anderes Script bereits zugreift


Sixnine

Recommended Posts

Hallo, was geht

ich blieb beim C# Scripting in Unity an einem komisch klingenden Problem hängen.
Ich hab ein simples C# Script, welches die Rotation der First Person Player - Kamera festlegt:

public class PlayerLook : PlayerBase
     {
     
     [Header("Looking around")]
     [SerializeField] float sensX = 15f;
     [SerializeField] float sensY = 15f;
     [SerializeField] float multiplier = 0.1f;
 
     Vector3 rot;
 
     void Start()
     {
         Cursor.lockState = CursorLockMode.Locked;
         Cursor.visible = false;
         rot = transform.eulerAngles;
     }
 
 
     void Update()
     {
 
         rot.y += Mouse_X * sensX * multiplier * Time.deltaTime;
         rot.x -= Mouse_Y * sensY * multiplier * Time.deltaTime;
         rot.x = Mathf.Clamp(rot.x, -90f, 90f);
 
         cam.transform.rotation = Quaternion.Euler(rot.x, rot.y, cam.transform.eulerAngles.z);
         orientation.transform.rotation = Quaternion.Euler(0, rot.y, orientation.transform.eulerAngles.z);
     }
 
     public void SetRotation(Vector3 angles)
     {
         rot = angles;
     }
 
 }

 

In einem anderen Script, möchte ich die Rotation der Spielerkamera manuell festlegen:
 

 ...
 
 //// make player look towards trolley
 
             PlayerLook looker = player.GetComponent<PlayerLook>();
 
             if (looker != null)
             {
                 looker.SetRotation(playerPosition.eulerAngles);
             }
             else
             {
                 fnc.cam.eulerAngles = playerPosition.eulerAngles;
             }
 
 ...

Mit meiner SetRotation()-Methode bei "PlayerLook" erhoffte ich mir eine Möglichkeit, die Spielerrotation manuell zu setzen.
Allerdings funktioniert es gar nicht.
Weite Fragen zu meinem Problem sind gerne erwünscht!

Hat jmd. irgendeine Idee?
Danke im voraus:)


LG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

das ist keines dieser Probleme, wo es "die" Lösung gibt. Da muss man sich präzise zusammenfassen, was man eigentlich will, und dafür dann eine Implementation finden.

Ich würde das so beschreiben:

Was du willst, ist ein Standardverhalten, das von einem anderen Script überschrieben werden kann. Das andere Script hat ein Ersatzverhalten parat, das stattdessen ausgeführt werden soll.

Das kann man jetzt auch anders beschreiben, und dann sieht auch die Implementation anders aus. Wenn man das jedenfalls implementieren will, dann muss man sich noch überlegen, wo man diese beiden Verhalten implementiert und wie man baut, dass das Script mal das eine, sonst das andere ausführt. Ich würde die Variante über Delegate/Actions nehmen. Weiß nicht, wie viel du damit schon zu tun hattest. Eine Action ist quasi eine Methode, aber in einer Variable gespeichert:

private void Start()
{
  Action stuff = Stuff;
  
  stuff();
}

private void Stuff()
{
  Debug.Log("Hallo");
}

Du kannst also eine Methode (und eine Methode ist ja Verhalten) in eine Variable packen.

public Action replacementLookBehavior;

private void Update()
{
  if (replacementLookBehavior != null) // Sonderverhalten wurde festgelegt
  {
    replacementLookBehavior(); // Dann führe das aus
  }
  else
  {
    DefaultLookBehavior(); // Sonst Standardverhalten
  }
  
}

private void DefaultLookBehavior()
{
  // ...
}

Ein anderes Script kann jetzt ankommen und in replacementLookBehavior ein Verhalten angeben. Wenn das dann gesetzt ist, wird dieses ausgeführt statt der Methode DefaultLookBehavior.

private DasAndereScript dasAndereScript;

private void Awake()
{
  dasAndereScript = GetComponent<DasAndereScript>();
}

private void Update()
{
  if (Input.GetButtonDown(KeyCode.Space)) // Nur so zum Testen
  {
    dasAndereScript.replacementLookBehavior = LookSomehow;
  }
}

private void LookSomehow()
{
  // ...
}

Und wenn du es auf null setzt, wird wieder das Standardverhalten rausgeholt. So definierst du dein Kamera-Script einmalig und musst es nicht noch einmal anfassen, wenn du ein neues Ersatzverhalten einbauen willst - weil dieses eben im Ersatzverhalten-Script definiert ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...