--- Geschrieben 21. Juli 2019 Melden Share Geschrieben 21. Juli 2019 Hallo, Ich würde gerne mein Spiel in Unity auch für mein Android Smartphone Spielbar machen Da habe ich mich gleich ran gesetzt und möchte Folgendes Umsetzten ich möchte einen Knopf auf dem Display habe mit dem ich einfach geradeaus laufen kann Die Richtungen soll mit der Camera Steuerbar sein die schon einwandfrei Funktioniert. Also habe ich versucht einen Button zu erstellen der die W/UpArrow Taste drückt sobald ich diesen Button ausführe. Das ganze habe ich mal mit diesem kleinen Script versucht. Script: using System.Collections; using System.Collections.Generic; using UnityEngine; public class RunBtn : MonoBehaviour { public void ButtonToClick(int clickToButton) { Debug.Log("Test Button"); if (Input.GetKeyDown(KeyCode.W)); } } Nur Leider passiert nichts habe ich einfach die Falsche Methode dafür oder ist es Grundsätzlich so nicht umzusetzen. Über Hilfe würde ich mich sehr Freuen MFG. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Ricky-W Geschrieben 22. Juli 2019 Melden Share Geschrieben 22. Juli 2019 Dumme Frage . Hast du das Script einem Objekt (Button) zugewiesen? Lg Ricky-W Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
--- Geschrieben 22. Juli 2019 Autor Melden Share Geschrieben 22. Juli 2019 Ja das hab ich alles gemacht nachdem ich denn Button drücke wird auch mein Debug.Log ausgeführt. Nur Leider wird die W/UpArrow Taste nicht gedrückt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tyroonis Geschrieben 22. Juli 2019 Melden Share Geschrieben 22. Juli 2019 vor 11 Stunden schrieb ThE_MAiTiX: if (Input.GetKeyDown(KeyCode.W)); Du fragst mit dem "if" ja auch ob sie gedrückt wird! Du willst sie aber ausführen. Das funtioniert so nicht. Ich würde einfach direkt die Funtion ausführen die die Taste W auch übernimmt und nicht die Taste W simulieren. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
--- Geschrieben 22. Juli 2019 Autor Melden Share Geschrieben 22. Juli 2019 Das habe ich auch schon versucht nur leider nutze ich einen PlayerCharakterControler aus einem Fremden Asset und finde die Methode die fürs Laufen zuständig ist nicht using UnityEngine; using System.Collections; public class PlayerControl : MonoBehaviour { public float walkSpeed = 0.15f; public float runSpeed = 1.0f; public float sprintSpeed = 2.0f; public float flySpeed = 4.0f; public float turnSmoothing = 3.0f; public float aimTurnSmoothing = 15.0f; public float speedDampTime = 0.1f; public float jumpHeight = 5.0f; public float jumpCooldown = 1.0f; private float timeToNextJump = 0; private float speed; private Vector3 lastDirection; private Animator anim; private int speedFloat; private int jumpBool; private int hFloat; private int vFloat; private int aimBool; private int flyBool; private int groundedBool; private Transform cameraTransform; public float Hinput; public float Vinput; private bool aim; private bool run; private bool sprint; private bool isMoving; // fly private bool fly = false; private float distToGround; private float sprintFactor; void Awake() { anim = GetComponent<Animator> (); cameraTransform = Camera.main.transform; speedFloat = Animator.StringToHash("Speed"); jumpBool = Animator.StringToHash("Jump"); hFloat = Animator.StringToHash("H"); vFloat = Animator.StringToHash("V"); aimBool = Animator.StringToHash("Aim"); // fly flyBool = Animator.StringToHash ("Fly"); groundedBool = Animator.StringToHash("Grounded"); distToGround = GetComponent<Collider>().bounds.extents.y; sprintFactor = sprintSpeed / runSpeed; } bool IsGrounded() { return Physics.Raycast(transform.position, -Vector3.up, distToGround + 0.1f); } void Update() { // fly if(Input.GetButtonDown ("Fly")) fly = !fly; aim = Input.GetButton("Aim"); Hinput = Input.GetAxis("Horizontal"); Vinput = Input.GetAxis("Vertical"); run = Input.GetButton ("Run"); sprint = Input.GetButton ("Sprint"); isMoving = Mathf.Abs(Hinput) > 0.1 || Mathf.Abs(Vinput) > 0.1; } void FixedUpdate() { anim.SetBool (aimBool, IsAiming()); anim.SetFloat(hFloat, Hinput); anim.SetFloat(vFloat, Vinput); // Fly anim.SetBool (flyBool, fly); GetComponent<Rigidbody>().useGravity = !fly; anim.SetBool (groundedBool, IsGrounded ()); if(fly) FlyManagement(Hinput,Vinput); else { MovementManagement (Hinput, Vinput, run, sprint); JumpManagement (); } } // fly void FlyManagement(float horizontal, float vertical) { Vector3 direction = Rotating(horizontal, vertical); GetComponent<Rigidbody>().AddForce(direction * flySpeed * 100 * (sprint?sprintFactor:1)); } void JumpManagement() { if (GetComponent<Rigidbody>().velocity.y < 10) // already jumped { anim.SetBool (jumpBool, false); if(timeToNextJump > 0) timeToNextJump -= Time.deltaTime; } if (Input.GetButtonDown ("Jump")) { anim.SetBool(jumpBool, true); if(speed > 0 && timeToNextJump <= 0 && !aim) { GetComponent<Rigidbody>().velocity = new Vector3(0, jumpHeight, 0); timeToNextJump = jumpCooldown; } } } void MovementManagement(float horizontal, float vertical, bool running, bool sprinting) { Rotating(horizontal, vertical); if(isMoving) { if(sprinting) { speed = sprintSpeed; } else if (running) { speed = runSpeed; } else { speed = walkSpeed; } anim.SetFloat(speedFloat, speed, speedDampTime, Time.deltaTime); } else { speed = 0f; anim.SetFloat(speedFloat, 0f); } GetComponent<Rigidbody>().AddForce(Vector3.forward*speed); } Vector3 Rotating(float horizontal, float vertical) { Vector3 forward = cameraTransform.TransformDirection(Vector3.forward); if (!fly) forward.y = 0.0f; forward = forward.normalized; Vector3 right = new Vector3(forward.z, 0, -forward.x); Vector3 targetDirection; float finalTurnSmoothing; if(IsAiming()) { targetDirection = forward; finalTurnSmoothing = aimTurnSmoothing; } else { targetDirection = forward * vertical + right * horizontal; finalTurnSmoothing = turnSmoothing; } if((isMoving && targetDirection != Vector3.zero) || IsAiming()) { Quaternion targetRotation = Quaternion.LookRotation (targetDirection, Vector3.up); // fly if (fly) targetRotation *= Quaternion.Euler (90, 0, 0); Quaternion newRotation = Quaternion.Slerp(GetComponent<Rigidbody>().rotation, targetRotation, finalTurnSmoothing * Time.deltaTime); GetComponent<Rigidbody>().MoveRotation (newRotation); lastDirection = targetDirection; } //idle - fly or grounded if(!(Mathf.Abs(Hinput) > 0.9 || Mathf.Abs(Vinput) > 0.9)) { Repositioning(); } return targetDirection; } private void Repositioning() { Vector3 repositioning = lastDirection; if(repositioning != Vector3.zero) { repositioning.y = 0; Quaternion targetRotation = Quaternion.LookRotation (repositioning, Vector3.up); Quaternion newRotation = Quaternion.Slerp(GetComponent<Rigidbody>().rotation, targetRotation, turnSmoothing * Time.deltaTime); GetComponent<Rigidbody>().MoveRotation (newRotation); } } public bool IsFlying() { return fly; } public bool IsAiming() { return aim && !fly; } public bool isSprinting() { return sprint && !aim && (isMoving); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tyroonis Geschrieben 22. Juli 2019 Melden Share Geschrieben 22. Juli 2019 vor 8 Minuten schrieb ThE_MAiTiX: Hinput = Input.GetAxis("Horizontal"); Vinput = Input.GetAxis("Vertical"); In den Controller wird nicht WASD gearbeitet sondern mit Achsen. vor 11 Minuten schrieb ThE_MAiTiX: MovementManagement (Hinput, Vinput, run, sprint); Also: MovementManagement (1,Vinput,run,sprint); Zumindest gehe ich davon aus. Bin leider auf Arbeit und habe nicht die Zeit es mir genau anzuschauen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
--- Geschrieben 22. Juli 2019 Autor Melden Share Geschrieben 22. Juli 2019 Habe es nun mal mit: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Running : MonoBehaviour { public void ButtonToClick(int clickToButton) { Debug.Log("Test Press Button"); var Running = GameObject.Find("char_shadow").GetComponent<PlayerControl>(); Running.MovementManagement(Hinput, Vinput, run, sprint); } } Getestet leider ohne Erfolg. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 23. Juli 2019 Melden Share Geschrieben 23. Juli 2019 Mal eine andere Frage... Möchtest Du einmal auf den Button tippen und dann läuft der Spieler permanent? Oder nur während Du den Button "hältst" laufen? Um auf die Methode von einer anderen Komponente zugreifen zu können, musst Du diese auch öffentlich zugänglich machen. Das machst Du z.B. mit dem "public" modifier. Dann müsstest Du im PlayerControl folgendes ändern //original void MovementManagement(float horizontal, float vertical, bool running, bool sprinting) //geändert public void MovementManagement(float horizontal, float vertical, bool running, bool sprinting) Zudem ist es eine ganz schlechte Idee, mit GameObject.Find() zu arbeiten. Stelle in der Running Komponente lieber ein Feld bereit, in welches Du dann im Inspector die PlayerControl Komponente zuweisen kannst. public class Running : MonoBehaviour { public PlayerControl playerControl; //dieses Feld siehst Du im Inspector, dort die PlayerControl Komponente reinziehen! public void ButtonToClick(int clickToButton) { Debug.Log("Test Press Button"); if(playerControl) { playerControl.MovementManagement(Hinput, Vinput, run, sprint); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
--- Geschrieben 23. Juli 2019 Autor Melden Share Geschrieben 23. Juli 2019 Vielen dank nur leider habe ich Folgende Fehler in meinem Script 4 Ich möchte das man den Button Gedrückt hält und sollange man in drückt läuft sobald man in los lässt stehenbleiben Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Ricky-W Geschrieben 24. Juli 2019 Melden Share Geschrieben 24. Juli 2019 Ich wissen wo Fehler liegt. Da aber ich kein Programmierer bin, kann ich dir nicht sagen, wie du es machen musst. Die 4 Variablen sind im einem anderen Script deklariert oder so, musstest nun so machen das sie in diesem Script übertragen werden. habe es nie verstanden warum man es so machen muss (wie man es macht), habe es nur immer nur abgeschrieben und dann hat´s irgendwie geklappt. Wegen meiner Ignoranz habe ich es auch aufgegeben zu Programmieren. Lg Ricky-W P.S. ich kann auch komplett einen Blödsinn geschrieben haben (wäre nichts neues ) aber der Drang zu helfen war größer. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tyroonis Geschrieben 24. Juli 2019 Melden Share Geschrieben 24. Juli 2019 SRY Aber ich muss das jetzt einfach mal so sagen. Anscheinend hast du dich noch nicht wirklich mit programmieren auseinander gesetzt. Durch stures Copy&Paste wirst du auf dauer nicht weit kommen. Schau dir am besten erstmal die C# Grundlagen an. Dann solltest du deinen fehler auch selbst erkennen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.