[RESOLVIDO] Trocar controles de keyboard para gui
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Trocar controles de keyboard para gui
Eu tenho 3 scrips que servem como controle para um helicóptero funcionar, o problema, é que eu mudei o projeto de pc para android, e preciso transferir esses controles de teclado para gui, mas eu não consigo fazer isso, e nem sei se é possível.
Tentei também, simular o aperto de uma tecla no teclado ao apertar no gui, mas o unity não permite isso.
De qualquer forma, alguém pode me dar alguma ideia de como fazer isso?
Esse aqui é o principal.
Ele tá grande mas é só no final que tem a parte útil, coloquei inteiro só pra se alguém precisar de usar, ou ter uma base.
Esse aqui, basicamente pega a tecla no teclado, e serializa.
Aqui é onde fica salvo
Obrigado à quem puder me ajudar. <3
Tentei também, simular o aperto de uma tecla no teclado ao apertar no gui, mas o unity não permite isso.
De qualquer forma, alguém pode me dar alguma ideia de como fazer isso?
Esse aqui é o principal.
Ele tá grande mas é só no final que tem a parte útil, coloquei inteiro só pra se alguém precisar de usar, ou ter uma base.
- Código:
using UnityEngine;
using UnityEngine.UI;
public class HelicopterController : MonoBehaviour
{
public AudioSource HelicopterSound;
public ControlPanel ControlPanel;
public Rigidbody HelicopterModel;
public HeliRotorController MainRotorController;
public HeliRotorController SubRotorController;
public float TurnForce = 3f;
public float ForwardForce = 10f;
public float ForwardTiltForce = 20f;
public float TurnTiltForce = 30f;
public float EffectiveHeight = 100f;
public float turnTiltForcePercent = 1.5f;
public float turnForcePercent = 1.3f;
private float _engineForce;
public float EngineForce
{
get { return _engineForce; }
set
{
MainRotorController.RotarSpeed = value * 80;
SubRotorController.RotarSpeed = value * 40;
HelicopterSound.pitch = Mathf.Clamp(value / 40, 0, 1.2f);
if (UIGameController.runtime.EngineForceView != null)
UIGameController.runtime.EngineForceView.text = string.Format("Engine value [ {0} ] ", (int)value);
_engineForce = value;
}
}
private Vector2 hMove = Vector2.zero;
private Vector2 hTilt = Vector2.zero;
private float hTurn = 0f;
public bool IsOnGround = true;
// Use this for initialization
void Start ()
{
ControlPanel.KeyPressed += OnKeyPressed;
}
void Update () {
}
void FixedUpdate()
{
LiftProcess();
MoveProcess();
TiltProcess();
}
private void MoveProcess()
{
var turn = TurnForce * Mathf.Lerp(hMove.x, hMove.x * (turnTiltForcePercent - Mathf.Abs(hMove.y)), Mathf.Max(0f, hMove.y));
hTurn = Mathf.Lerp(hTurn, turn, Time.fixedDeltaTime * TurnForce);
HelicopterModel.AddRelativeTorque(0f, hTurn * HelicopterModel.mass, 0f);
HelicopterModel.AddRelativeForce(Vector3.forward * Mathf.Max(0f, hMove.y * ForwardForce * HelicopterModel.mass));
}
private void LiftProcess()
{
var upForce = 1 - Mathf.Clamp(HelicopterModel.transform.position.y / EffectiveHeight, 0, 1);
upForce = Mathf.Lerp(0f, EngineForce, upForce) * HelicopterModel.mass;
HelicopterModel.AddRelativeForce(Vector3.up * upForce);
}
private void TiltProcess()
{
hTilt.x = Mathf.Lerp(hTilt.x, hMove.x * TurnTiltForce, Time.deltaTime);
hTilt.y = Mathf.Lerp(hTilt.y, hMove.y * ForwardTiltForce, Time.deltaTime);
HelicopterModel.transform.localRotation = Quaternion.Euler(hTilt.y, HelicopterModel.transform.localEulerAngles.y, -hTilt.x);
}
private void OnKeyPressed(PressedKeyCode[] obj)
{
float tempY = 0;
float tempX = 0;
// stable forward
if (hMove.y > 0)
tempY = - Time.fixedDeltaTime;
else
if (hMove.y < 0)
tempY = Time.fixedDeltaTime;
// stable lurn
if (hMove.x > 0)
tempX = -Time.fixedDeltaTime;
else
if (hMove.x < 0)
tempX = Time.fixedDeltaTime;
foreach (var pressedKeyCode in obj)
{
switch (pressedKeyCode)
{
case PressedKeyCode.SpeedUpPressed:
EngineForce += 0.1f;
break;
case PressedKeyCode.SpeedDownPressed:
EngineForce -= 0.12f;
if (EngineForce < 0) EngineForce = 0;
break;
case PressedKeyCode.ForwardPressed:
if (IsOnGround) break;
tempY = Time.fixedDeltaTime;
break;
case PressedKeyCode.BackPressed:
if (IsOnGround) break;
tempY = -Time.fixedDeltaTime;
break;
case PressedKeyCode.LeftPressed:
if (IsOnGround) break;
tempX = -Time.fixedDeltaTime;
break;
case PressedKeyCode.RightPressed:
if (IsOnGround) break;
tempX = Time.fixedDeltaTime;
break;
case PressedKeyCode.TurnRightPressed:
{
if (IsOnGround) break;
var force = (turnForcePercent - Mathf.Abs(hMove.y))*HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
case PressedKeyCode.TurnLeftPressed:
{
if (IsOnGround) break;
var force = -(turnForcePercent - Mathf.Abs(hMove.y))*HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
}
}
hMove.x += tempX;
hMove.x = Mathf.Clamp(hMove.x, -1, 1);
hMove.y += tempY;
hMove.y = Mathf.Clamp(hMove.y, -1, 1);
}
private void OnCollisionEnter()
{
IsOnGround = true;
}
private void OnCollisionExit()
{
IsOnGround = false;
}
}
Esse aqui, basicamente pega a tecla no teclado, e serializa.
- Código:
using System;
using System.Collections.Generic;
using UnityEngine;
public class ControlPanel : MonoBehaviour {
public AudioSource MusicSound;
[SerializeField]
KeyCode SpeedUp = KeyCode.Space;
[SerializeField]
KeyCode SpeedDown = KeyCode.C;
[SerializeField]
KeyCode Forward = KeyCode.W;
[SerializeField]
KeyCode Back = KeyCode.S;
[SerializeField]
KeyCode Left = KeyCode.A;
[SerializeField]
KeyCode Right = KeyCode.D;
[SerializeField]
KeyCode TurnLeft = KeyCode.Q;
[SerializeField]
KeyCode TurnRight = KeyCode.E;
[SerializeField]
KeyCode MusicOffOn = KeyCode.M;
private KeyCode[] keyCodes;
public Action<PressedKeyCode[]> KeyPressed;
private void Awake()
{
keyCodes = new[] {
SpeedUp,
SpeedDown,
Forward,
Back,
Left,
Right,
TurnLeft,
TurnRight
};
}
void Start () {
}
void FixedUpdate ()
{
var pressedKeyCode = new List<PressedKeyCode>();
for (int index = 0; index < keyCodes.Length; index++)
{
var keyCode = keyCodes[index];
if (Input.GetKey(keyCode))
pressedKeyCode.Add((PressedKeyCode)index);
}
if (KeyPressed != null)
KeyPressed(pressedKeyCode.ToArray());
// for test
if (Input.GetKey(MusicOffOn))
{
if ( MusicSound.volume == 1) return;
/* if (MusicSound.isPlaying)
MusicSound.Stop();
else*/
MusicSound.volume = 1;
MusicSound.Play();
}
}
}
Aqui é onde fica salvo
- Código:
public enum PressedKeyCode
{
SpeedUpPressed,
SpeedDownPressed,
ForwardPressed,
BackPressed,
LeftPressed,
RightPressed,
TurnLeftPressed,
TurnRightPressed
}
Obrigado à quem puder me ajudar. <3
Última edição por dstaroski em Dom Abr 22, 2018 6:50 pm, editado 1 vez(es) (Motivo da edição : Resolvido)
Re: [RESOLVIDO] Trocar controles de keyboard para gui
+
Eu sei que eu tenho que colocar um public void, e fazer o botão no gui ativá-lo, mas não sei onde nesses códigos eu preciso colocar esse void que o botão vai usar pra fazer cada movimento...
Eu sei que eu tenho que colocar um public void, e fazer o botão no gui ativá-lo, mas não sei onde nesses códigos eu preciso colocar esse void que o botão vai usar pra fazer cada movimento...
Re: [RESOLVIDO] Trocar controles de keyboard para gui
Eu acabei encontrando a solução aqui, obrigado de qualquer forma. ;P
Tópicos semelhantes
» [RESOLVIDO]Script de movimentação, problema para trocar de animação
» [RESOLVIDO] Conflito com Controles !
» CONTROLES COM JOYSTICK PARA ANDROID
» [TUTORIAL] Controles para personagem 2.5 D
» CONTROLES JOYSTICK PARA MOBILE (ANDROID e IOS)
» [RESOLVIDO] Conflito com Controles !
» CONTROLES COM JOYSTICK PARA ANDROID
» [TUTORIAL] Controles para personagem 2.5 D
» CONTROLES JOYSTICK PARA MOBILE (ANDROID e IOS)
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos