Jump to content
Unity Insider Forum

Durch einen Button einen Knopfdruck Simulieren.


---

Recommended Posts

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

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

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

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

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

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

:D Ich wissen wo Fehler liegt. :unsure: 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 B) ) aber der Drang zu helfen war größer.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Archiviert

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

×
×
  • Neu erstellen...