- Home /
Question by
HemK · Sep 01, 2020 at 11:20 AM ·
scripting problembeginnertouch controls
Touch dual Joystick script working eratically
Hi,
I've written the following script for a dual touch - on screen joystick. The trouble I'm having is both joysticks are appearing to move the player, instead of one of them moving and the other rotating the character. Can someone please tell me what I'm doing wrong?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MyJSScript : MonoBehaviour
{
private bool touchStart = false;
public float speed = 10;
private Vector2 leftTouchA; //Initial touch pos
private Vector2 leftTouchB; //moved from touchA to this pos
private Vector2 rightTouchA; //Initial touch pos
private Vector2 rightTouchB; //moved from touchA to this pos
private int leftTouch = 99;
private int rightTouch = 98;
public NavMeshAgent nav;
public GameObject player;
// Start is called before the first frame update
void Start()
{
nav = GetComponent<NavMeshAgent>();
Vector3 playerSpeed = nav.velocity;
}
// Update is called once per frame
void Update()
{
int i = 0;
while (i < Input.touchCount)
{
Touch t = Input.GetTouch(i);
if (t.phase == TouchPhase.Began)
{
if (t.position.x > Screen.width / 2) //check screen touch location
{ rightTouch = t.fingerId; rightTouchA = t.position; } //if touch location is less than screen width, make the pos right JS positon and touchID as right finger id.
else { leftTouch = t.fingerId; leftTouchA = t.position; } // else the assign position and ID to the left JS
}
else if (t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary && leftTouch == t.fingerId) //Left JS instruction in Move phase or Stationary phase
{
leftTouchB = t.position; //assign current position in moved state to leftTouchB: the moved location.
Vector2 offset = leftTouchB - leftTouchA;
Vector2 direction = Vector2.ClampMagnitude(offset, 1.0f); //subtract A from B to get a vector for plr direction. Clamp Magnitude to 1f to make it like a JS axis.
playerMover(direction);
}
else if (t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary && rightTouch == t.fingerId) //Right JS instruction in Move or stationary phase
{
rightTouchB = t.position; //assign current position in moved state to leftTouchB: the moved location.
Vector2 offset = rightTouchB - rightTouchA;
Vector2 look = Vector2.ClampMagnitude(offset, 1.0f); //subtract A from B to get a vector for plr look direction. Clamp Magnitude to 1f to make it like a JS axis.
playerLook(look);
}
else if (t.phase == TouchPhase.Ended && leftTouch == t.fingerId)
{ leftTouch = 99; }
else if (t.phase == TouchPhase.Ended && rightTouch == t.fingerId)
{ rightTouch = 98; }
i++;
}
}
void playerMover(Vector2 direction)
{
nav.velocity = new Vector3 (direction.x*speed, 0, direction.y* speed);
}
void playerLook(Vector2 look)
{
Vector3 target = new Vector3(look.x, 0f, look.y);
player.transform.LookAt(target); }
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220613011007im_/https://answers.unity.com/themes/thub/images/avi.jpg)