I am trying to make a simple mobile game where half of the screen (held in landscape) is a joystick and the other half is used for an attack. How would I attempt this?
Thank you ![]()
I am trying to make a simple mobile game where half of the screen (held in landscape) is a joystick and the other half is used for an attack. How would I attempt this?
Thank you ![]()
Get the Standard Assets package. It comes with a joystick prefab.
I actually solved my issue with a different asset and the code is:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Joystick : MonoBehaviour , IPointerUpHandler , IDragHandler {
#region Variables
[Tooltip("Make X = Y")]
public Vector2 TouchAria = new Vector2 (300, 300);
private Vector3 startPos;
[Tooltip("Call to get output on other code.")]
public Vector2 JoystickInput;
[HideInInspector] public Vector3 last; // vector to set the Gizmo
[Tooltip("Hide Joystick if not in use.")]
public bool hideJoystick = false;
private Image JoystickImage; //If you want the object to hide it will try to find the image on the object
private bool startAction; // is called when you want the object to start on drag
[Tooltip("Start joystick at 0 in any aria.")]
public bool startActionAtDrag;
[Tooltip("Turn On To Use Touch From Remote.")]
public bool UsingUnityRemote;
private Touch TouchOnJoystick;
private int ID;
public bool stillMove;
/// <summary>
/// If using mouse input.
/// </summary>
private Touch FakeTouch = new Touch();
private bool FakeID;
#endregion
void OnEnable ()
{
startPos = transform.position;
if (gameObject.GetComponent<Image> ()) {
JoystickImage = gameObject.GetComponent<Image> ();
}
if (JoystickImage && hideJoystick == true) {
JoystickImage.CrossFadeAlpha (0, 0, true);
}
}
void Update()
{
if(JoystickInput.x > 1 || JoystickInput.y > 1 || JoystickInput.x < -1 || JoystickInput.y < -1)
{
stillMove = false;
} else
{
stillMove = true;
}
}
void LateUpdate(){
/*This assures that each object is assigned it's own Touch ID so that you do not activate other buttons on drag*/
#if !UNITY_EDITOR
if (hideJoystick) {
if(Input.touchCount <= 0){
ID = -1;
}
else if(ID == -1 && Input.touchCount>0){
for (var i = 0; i < Input.touchCount; ++i) {
if (Mathf.Abs(Input.touches [i].position.x - transform.position.x) < TouchAria.x/2 &&
Mathf.Abs(Input.touches [i].position.y- transform.position.y) < TouchAria.y/2 ){
if(Input.touches [i].phase == TouchPhase.Began){
ID = Input.touches [i].fingerId;
}
}
}
}
for (var i = 0; i < Input.touchCount; ++i) {
if(ID == Input.touches [i].fingerId){
FollowFinger (Input.touches [i]);
}
}
}
#else
if(!UsingUnityRemote){
if(Input.GetMouseButtonUp(0)){
FakeID = false;
startAction = false;
startPos = transform.position;
transform.position = last;
UpdateVirtualAxes (startPos);
if (JoystickImage && hideJoystick == true) {
JoystickImage.CrossFadeAlpha (0, .2f, true);
}
}
else if(FakeID == false && Input.GetMouseButtonDown(0)){
if (Mathf.Abs(Input.mousePosition.x - transform.position.x) < TouchAria.x/2 &&
Mathf.Abs(Input.mousePosition.y- transform.position.y) < TouchAria.y/2){
FakeID = true;
}
}
if(FakeID == true){
FollowFinger (FakeTouch);
}
}
else{
if (hideJoystick) {
if(Input.touchCount <= 0){
ID = -1;
}
else if(ID == -1 && Input.touchCount>0){
for (var i = 0; i < Input.touchCount; ++i) {
if (Mathf.Abs(Input.touches [i].position.x - transform.position.x) < TouchAria.x/2 &&
Mathf.Abs(Input.touches [i].position.y- transform.position.y) < TouchAria.y/2 ){
if(Input.touches [i].phase == TouchPhase.Began){
ID = Input.touches [i].fingerId;
}
}
}
}
for (var i = 0; i < Input.touchCount; ++i) {
if(ID == Input.touches [i].fingerId){
FollowFinger (Input.touches [i]);
}
}
}
}
#endif
}
private void UpdateVirtualAxes (Vector3 value) {
var delta = startPos - value;
delta.x /= TouchAria.x;
delta.y /= TouchAria.y;
JoystickInput = new Vector2 (-delta.x, -delta.y) * 2;
}
public void FollowFinger(Touch _Touch){
Vector3 data;
#if !UNITY_EDITOR
TouchOnJoystick = _Touch;
if (Mathf.Abs(TouchOnJoystick.position.x - transform.position.x) < TouchAria.x/2 && //
Mathf.Abs(TouchOnJoystick.position.y- transform.position.y) < TouchAria.y/2 ){ //
gameObject.transform.position = new Vector3( _Touch.position.x, _Touch.position.y,transform.position.z);
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (1, .2f, true);
}
startAction = true;
}
if(startActionAtDrag && TouchOnJoystick.phase == TouchPhase.Began){
startPos = transform.position;
}
if (startAction) {
data = new Vector3(TouchOnJoystick.position.x,TouchOnJoystick.position.y,transform.position.z);
Vector3 newPos = Vector3.zero;
float deltax = (int)(data.x - startPos.x);
//deltax = Mathf.Clamp(deltax, -TouchAria.x / 2, TouchAria.x / 2);
newPos.x = deltax;
float deltay = (int)(data.y - startPos.y);
//deltay = Mathf.Clamp(deltay, -TouchAria.y / 2, TouchAria.y / 2);
newPos.y = deltay;
transform.position = Vector3.ClampMagnitude(new Vector3(newPos.x, newPos.y, newPos.z), TouchAria.x / 2) + startPos;
//transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
UpdateVirtualAxes (transform.position);
}
if (TouchOnJoystick.phase == TouchPhase.Ended) {
startAction = false;
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (0, .1f, true);
}
transform.position = last;
UpdateVirtualAxes (startPos);
}
#else
if (!UsingUnityRemote){
if (Mathf.Abs(Input.mousePosition.x - transform.position.x) < TouchAria.x/2 && //
Mathf.Abs(Input.mousePosition.y- transform.position.y) < TouchAria.y/2 && Input.GetMouseButton(0)){ //
gameObject.transform.position = new Vector3(Input.mousePosition.x,Input.mousePosition.y,transform.position.z);
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (1, .2f, true);
}
startAction = true;
}
if(startActionAtDrag && Input.GetMouseButtonDown(0)){
startPos = transform.position;
}
if (startAction) {
data = new Vector3(Input.mousePosition.x,Input.mousePosition.y,transform.position.z);
Vector3 newPos = Vector3.zero;
float deltax = (int)(data.x - startPos.x);
//deltax = Mathf.Clamp(deltax, -TouchAria.x / 2, TouchAria.x / 2);
newPos.x = deltax;
float deltay = (int)(data.y - startPos.y);
//deltay = Mathf.Clamp(deltay, -TouchAria.y / 2, TouchAria.y / 2);
newPos.y = deltay;
transform.position = Vector3.ClampMagnitude(new Vector3(newPos.x, newPos.y, newPos.z), TouchAria.x / 2) + startPos;
//transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
//transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
UpdateVirtualAxes(transform.position);
}
if (Input.GetMouseButtonUp (0)) {
startAction = false;
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (0, .2f, true);
}
transform.position = startPos;
UpdateVirtualAxes (startPos);
}
}
else{
TouchOnJoystick = _Touch;
if (Mathf.Abs(TouchOnJoystick.position.x - transform.position.x) < TouchAria.x/2 && // /2
Mathf.Abs(TouchOnJoystick.position.y- transform.position.y) < TouchAria.y/2 ){ //
gameObject.transform.position = new Vector3( _Touch.position.x, _Touch.position.y,transform.position.z);
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (1, .2f, true);
}
startAction = true;
}
if(startActionAtDrag && TouchOnJoystick.phase == TouchPhase.Began){
startPos = transform.position;
}
if (startAction) {
data = new Vector3(TouchOnJoystick.position.x,TouchOnJoystick.position.y,transform.position.z);
Vector3 newPos = Vector3.zero;
float deltax = (int)(data.x - startPos.x);
//deltax = Mathf.Clamp(deltax, -TouchAria.x / 2, TouchAria.x / 2);
newPos.x = deltax;
float deltay = (int)(data.y - startPos.y);
//deltay = Mathf.Clamp(deltay, -TouchAria.y / 2, TouchAria.y / 2);
newPos.y = deltay;
transform.position = Vector3.ClampMagnitude(new Vector3(newPos.x, newPos.y, newPos.z), TouchAria.x / 2) + startPos;
//transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
UpdateVirtualAxes(transform.position);
}
if (TouchOnJoystick.phase == TouchPhase.Ended) {
startAction = false;
if (JoystickImage) {
JoystickImage.CrossFadeAlpha (0, .1f, true);
}
transform.position = last;
UpdateVirtualAxes (startPos);
}
}
#endif
}
public void OnDrag(PointerEventData data) {
if(!hideJoystick){
Vector3 newPos = Vector3.zero;
float deltax = (int)(data.position.x - startPos.x);
//deltax = Mathf.Clamp(deltax, -TouchAria.x / 2, TouchAria.x / 2);
newPos.x = deltax;
float deltay = (int)(data.position.y - startPos.y);
//deltay = Mathf.Clamp(deltay, -TouchAria.y / 2, TouchAria.y / 2);
newPos.y = deltay;
transform.position = Vector3.ClampMagnitude(new Vector3(newPos.x, newPos.y, newPos.z), TouchAria.x / 2) + startPos;
//transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
UpdateVirtualAxes(transform.position);
}
}
public void OnPointerUp(PointerEventData data)
{
if(!hideJoystick){
if (JoystickImage && hideJoystick == true) {
JoystickImage.CrossFadeAlpha (0, .2f, true);
}
transform.position = startPos;
UpdateVirtualAxes (startPos);
}
}
void OnDrawGizmos() {
/* This is all the visual stuff to help visualize the bounds for the joystick */
Vector3 lastpos;
if (!Application.isPlaying) {
lastpos = transform.position;
last= lastpos;
}
Gizmos.DrawWireCube (last, new Vector3 (TouchAria.x, TouchAria.y, .1f));
}
}
works fine
Be careful with posting code from downloaded assets. I think you arenβt supposed to do that, especially with the paid assets.