Sixnine Geschrieben 30. Mai 2021 Melden Share Geschrieben 30. Mai 2021 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 30. Mai 2021 Melden Share Geschrieben 30. Mai 2021 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.