2017-12-19 5 views
0

Ich habe zwei Probleme mit der Umsetzung der zwei virtuellen Joysticks in Unity 5: eine für Spieler Bewegung (graue Farbe) und die zweite für die Kamera (orange Farbe) finden Sie im folgenden Screenshot:VirtualJoystick Probleme mit Unity5

enter image description here

Meine Probleme:

  1. für den virtuellen Joystick verantwortlich für Spieler Bewegung, wird das Spielerobjekt nicht den Joystick in die gleiche Richtung drehen, gedrückt wird, es in alle Richtungen bewegt sich aber nicht in die gleiche Richtung, dass der Joystic k wird gedrückt.
  2. Die Kamera kann durch das Gelände/Boden sehen. Wie verhindere ich das?

Das Skript, das ich von virtuellen Joystick bin mit:

using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; 

public class VirtualJoystick : MonoBehaviour,IDragHandler,IPointerUpHandler,IPointerDownHandler { 

    private Image bgImg; 
    private Image joystickImg; 
    public Vector3 InputDirection{ set; get;} 
    // Use this for initialization 
    void Start() { 
     bgImg = GetComponent<Image>(); 
     joystickImg = transform.GetChild (0).GetComponent<Image>(); 
     InputDirection = Vector3.zero; 

    } 

    // Update is called once per frame 
    //void Update() { 

    //} 
    public virtual void OnDrag(PointerEventData ped) 
    { 
     Vector2 pos = Vector2.zero; 
     if (RectTransformUtility.ScreenPointToLocalPointInRectangle 
      (bgImg.rectTransform, 
       ped.position, 
       ped.pressEventCamera, 
       out pos)) { 
      pos.x=(pos.x/bgImg.rectTransform.sizeDelta.x); 
      pos.y=(pos.y/bgImg.rectTransform.sizeDelta.y); 
      float x=(bgImg.rectTransform.pivot.x==1) ? pos.x*2+1 : pos.x*2-1; 
      float y=(bgImg.rectTransform.pivot.y==1) ? pos.y*2+1 : pos.y*2-1; 
      InputDirection=new Vector3(x,0,y); 
      InputDirection=(InputDirection.magnitude>1) ? InputDirection.normalized : InputDirection; 

      joystickImg.rectTransform.anchoredPosition= 
       new Vector3(InputDirection.x*(bgImg.rectTransform.sizeDelta.x/3),InputDirection.z*(bgImg.rectTransform.sizeDelta.y/3)); 
      Debug.Log(InputDirection); 
     } 

    } 
    public virtual void OnPointerDown(PointerEventData ped) 
    { 
     OnDrag (ped); 

    } 
    public virtual void OnPointerUp(PointerEventData ped) 
    { 


     //Here is the problem it just goes to zero so fast so my character also moves so fast...how can i make it so motth 
     InputDirection =Vector3.zero; 
     joystickImg.rectTransform.anchoredPosition =Vector3.zero; 
    } 
} 

Das Skript den Spieler zu bewegen:

using UnityEngine; using System.Collections; 

public class Motor : MonoBehaviour { 

    public float moveSpeed = 5.0f; 
    public float drag = 0.5f; 
    public float terminalRotationSpeed = 25.0f; 
    private Rigidbody controller; 
    private Transform camtransform; 
    public VirtualJoystick movejoystick; 
    private void Start() 
    { 
     controller =GetComponent<Rigidbody>(); 
     controller.maxAngularVelocity = terminalRotationSpeed; 
     controller.drag = drag; 
     camtransform = Camera.main.transform; 
    } 
    private void Update() 
    { 
     Vector3 dir = Vector3.zero; 
     dir.x = Input.GetAxis ("Horizontal"); 
     dir.z = Input.GetAxis ("Vertical"); 
     if (dir.magnitude > 1) 
      dir.Normalize(); 
     if (movejoystick.InputDirection != Vector3.zero) { 
      dir = movejoystick.InputDirection; 
     } 

     Vector3 rotatedDir = camtransform.TransformDirection (dir); 
     rotatedDir = new Vector3 (rotatedDir.x, 0, rotatedDir.z); 
     rotatedDir = rotatedDir.normalized * dir.magnitude; 
     controller.AddForce (dir * moveSpeed); 
     Quaternion eulerRot = Quaternion.Euler(0.0f, 0.0f, rotatedDir.x); 
     transform.rotation = Quaternion.Slerp(transform.rotation, eulerRot, Time.deltaTime * 10); 
    } 
} 

Das Skript ich bin für die Kamera:

using UnityEngine; 
using System.Collections; 

public class FreeCamera : 
MonoBehaviour { 
    public Transform lookAt; 
    public VirtualJoystick camerajs; 
    private float distance = 200.0f; 
    private float currentx = 0.0f; 
    private float currenty = 0.0f; 
    private float sensitivityx = 1.0f; 
    private float sensitivityy = 1.0f; 
    private void Update() 
    { 
     currentx += camerajs.InputDirection.x * sensitivityx; 
     currenty += camerajs.InputDirection.z * sensitivityy; 
    } 
    private void LateUpdate() 
    { 
     Vector3 dir = new Vector3(0, 0, -distance); 
     Quaternion rotation = Quaternion.Euler(currenty, currentx, 0); 
     transform.position = lookAt.position + rotation * dir; 
     transform.LookAt(lookAt); 
    } 
} 

mehr Screenshots:

enter image description here

+0

leider vergessen i Screen descrtion hinzuzufügen .. aber der Link funktioniert und Sie können die Triebe sehen –

+0

Das sind zwei verschiedene Themen. Bitte stellen Sie nur eine Frage. Wenn Sie Ihre Antwort bekommen, fragen Sie eine neue. Sie können Ihre Frage mit einem bestimmten Problem bearbeiten. – Programmer

+0

"Das Spielerobjekt rotiert nicht in die gleiche Richtung wie der Joystick gedrückt wird" Wenn der Joystick bewegt wird, erwarten Sie, dass sich das Spielerobjekt in Richtung Bildschirm dreht oder erwarten Sie, dass sich der Spieler vorwärts bewegt? –

Antwort

0

Für Frage 1: Der Code unter der ersten Windungen gemäß Joystick-x-Richtung und dann vorwärts/rückwärts bewegen gemäß Joystick-y. In Motor.Update:

private void Update() 
{ 
    Vector3 dir = Vector3.zero; 
    dir.x = Input.GetAxis ("Horizontal"); 
    dir.z = Input.GetAxis ("Vertical"); 
    if (dir.magnitude > 1) 
     dir.Normalize(); 
    if (movejoystick.InputDirection != Vector3.zero) { 
     dir = movejoystick.InputDirection; 
    } 

    Vector3 rotatedDir = transform.TransformDirection (dir); // world direction of joystick direction 
    Vector3 newDir = Vector3.RotateTowards(transform.forward, rotatedDir, Time.deltaTime * 10f, 0.0F); // turn towards joystick direction 
    transform.rotation = Quaternion.LookRotation(newDir); // set the new direction 
    controller.AddForce (transform.forward * moveSpeed * dir.z); // scale force by joystick up/down 
} 
+0

Lieber Mikko ... vielen Dank das erste Problem ist erfolgreich eingesetzt und getestet, wo jetzt ich bestätige, es funktioniert perfekt .... Vielen Dank . freundlicherweise brauche ich Unterstützung, um das zweite Problem zu lösen –