- Home /
Mobile input is not working ...
Hello guys i have a problem in my script i am making a cube rolling with arrow keys in unity ...but when i change it in drag system (mobile input or click drag) it is not working ....i want it to drag in X and Y axis .....i am not familiar with unity...check out my error part..
void Update () {
float x = 0;
float y = 0;
x = Input.GetAxisRaw ("Horizontal");
if (x == 0) {
y = Input.GetAxisRaw ("Vertical");
}
if ((x != 0 || y != 0) && !isRotate) {
directionX = y;
directionZ = x;
startPos = transform.position;
fromRotation = transform.rotation;
transform.Rotate (directionZ * 90, 0, directionX * 90, Space.World);
toRotation = transform.rotation;
transform.rotation = fromRotation;
rotationTime = 0;
isRotate = true;
}
}
Check my mistake plzz ..
Answer by Zgull · Jun 17, 2018 at 01:09 PM
Follow these steps to get the exact issue.
1) Use Log to check if both "Input.GetAxisRaw ("Horizontal");" and "Input.GetAxisRaw ("Vertical");" always gives you "0".
2) On a mobile device, tilting your phone changes these values. On the editor, the arrow keys changes the values.
3) If both are zero, try and use "Input.acceleration.x" instead of "Input.GetAxisRaw ("Horizontal");" and "Input.acceleration.y" instead of "Input.GetAxisRaw ("Vertical");". Note if it works.
I hope you are changing the value of "isRotate" at some point after setting it to "true". Otherwise you wouldn't be able to see any changes, as the values are applied only once.
I have added the full code. You can modify it as you want.
using UnityEngine;
using System.Collections;
using System;
public class CubeController : MonoBehaviour {
public float rotationPeriod = 0.3f;
public float sideLength = 1f;
bool isRotate = false;
float directionX = 0;
float directionZ = 0;
Vector3 startPos;
float rotationTime = 0;
float radius;
Quaternion fromRotation;
Quaternion toRotation;
float x,y;
public float minSwipeDistY = 1;
public float minSwipeDistX = 1;
private Vector3 touchStartPos;
// Use this for initialization
void Start()
{
radius = sideLength * Mathf.Sqrt(2f) / 2f;
}
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR || UNITY_STANDALONE
x = Input.GetAxisRaw("Horizontal");
if (x == 0)
{
y = Input.GetAxisRaw("Vertical");
}
#else
DetectSwipe();
#endif
if ((x != 0 || y != 0) && !isRotate)
{
directionX = y;
directionZ = x;
startPos = transform.position;
fromRotation = transform.rotation;
transform.Rotate(directionZ * 90, 0, directionX * 90, Space.World);
toRotation = transform.rotation;
transform.rotation = fromRotation;
rotationTime = 0;
isRotate = true;
}
}
void FixedUpdate()
{
if (isRotate)
{
rotationTime += Time.fixedDeltaTime;
float ratio = Mathf.Lerp(0, 1, rotationTime / rotationPeriod);
float thetaRad = Mathf.Lerp(0, Mathf.PI / 2f, ratio);
float distanceX = -directionX * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));
float distanceY = radius * (Mathf.Sin(45f * Mathf.Deg2Rad + thetaRad) - Mathf.Sin(45f * Mathf.Deg2Rad));
float distanceZ = directionZ * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));
transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ);
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio);
if (ratio == 1)
{
isRotate = false;
directionX = 0;
directionZ = 0;
rotationTime = 0;
}
}
}
void DetectSwipe()
{
x = y = 0;
if (Input.touchCount > 0)
{
Touch touch = Input.touches[0];
switch (touch.phase)
{
case TouchPhase.Began:
touchStartPos = touch.position;
break;
case TouchPhase.Ended:
float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, touchStartPos.y, 0)).magnitude;
if (swipeDistVertical > minSwipeDistY)
{
float swipeValue = Mathf.Sign(touch.position.y - touchStartPos.y);
y = swipeValue;
/*if (swipeValue > 0)//up swipe
Jump ();
else if (swipeValue < 0)//down swipe
Shrink ();*/
}
float swipeDistHorizontal = (new Vector3(touch.position.x,0, 0) - new Vector3(touchStartPos.x, 0, 0)).magnitude;
if (swipeDistHorizontal > minSwipeDistX)
{
float swipeValue = Mathf.Sign(touch.position.x - touchStartPos.x);
x = swipeValue;
/*if (swipeValue > 0)//right swipe
MoveRight ();
else if (swipeValue < 0)//left swipe
MoveLeft ();*/
}
break;
}
}
}
}
Thanks buddy i appreciate your answer but the problem is mobile input this script is only working with arrows keys... i don't know how to change it in mobile input like drag system .. (similar to Edge game)...i will show you my whole script...this whole script sits on a cube which is rolling perfectly with arrow keys..may be we have to change Horizontal and vertical in the script can you help me plzz..
public float rotationPeriod = 0.3f;
public float sideLength = 1f;
bool isRotate = false;
float directionX = 0;
float directionZ = 0;
Vector3 startPos;
float rotationTime = 0;
float radius;
Quaternion fromRotation;
Quaternion toRotation;
// Use this for initialization
void Start () {
radius = sideLength * $$anonymous$$athf.Sqrt (2f) / 2f;
}
// Update is called once per frame
void Update () {
float x = 0;
float y = 0;
x = Input.GetAxisRaw ("Horizontal");
if (x == 0) {
y = Input.GetAxisRaw ("Vertical");
}
if ((x != 0 || y != 0) && !isRotate) {
directionX = y;
directionZ = x;
startPos = transform.position;
fromRotation = transform.rotation;
transform.Rotate (directionZ * 90, 0, directionX * 90, Space.World);
toRotation = transform.rotation;
transform.rotation = fromRotation;
rotationTime = 0;
isRotate = true;
}
}
void FixedUpdate() {
if (isRotate) {
rotationTime += Time.fixedDeltaTime;
float ratio = $$anonymous$$athf.Lerp(0, 1, rotationTime / rotationPeriod);
float thetaRad = $$anonymous$$athf.Lerp(0, $$anonymous$$athf.PI / 2f, ratio);
float distanceX = -directionX * radius * ($$anonymous$$athf.Cos (45f * $$anonymous$$athf.Deg2Rad) - $$anonymous$$athf.Cos (45f * $$anonymous$$athf.Deg2Rad + thetaRad));
float distanceY = radius * ($$anonymous$$athf.Sin(45f * $$anonymous$$athf.Deg2Rad + thetaRad) - $$anonymous$$athf.Sin (45f * $$anonymous$$athf.Deg2Rad));
float distanceZ = directionZ * radius * ($$anonymous$$athf.Cos (45f * $$anonymous$$athf.Deg2Rad) - $$anonymous$$athf.Cos (45f * $$anonymous$$athf.Deg2Rad + thetaRad));
transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ);
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio);
if (ratio == 1) {
isRotate = false;
directionX = 0;
directionZ = 0;
rotationTime = 0;
}
}
}
You should replace "Input.GetAxisRaw()", if you want to detect swipe.
Add code to detect swipe in all four directions. You can refer the following post: https://answers.unity.com/questions/600148/detect-swipe-in-four-directions-android.html
The "swipeValue" gives the value for x and y.
I understand it sir but i don't know how to replace it with my code .... Can you help me with that sir...
The code that you have posted should be working in mobile without swipe. If you turn your mobile to the right, it should turn the cube in that direction. If you want it to work with swipe, check the above link.