JoyStick didn't know how to publish it to the mobile phone before. Someone on the Internet said that the mouse click on the desktop is the same as the touch click on the mobile phone. Just change the WSAD key on the computer to four buttons, and the left mouse button attack to a button on the mobile phone. Other functions need to learn the touch touch touch method on the mobile terminal. At that time, I thought, change it to B Utton is very simple. Touch still doesn't care. It's hard to think about it. (do not want to use plug-ins)
In the later practical operation, I also think that there is a joystick on the left when playing mobile games. I think it's better to use a joystick or a joystick, so I searched the big guy's tutorial. How to judge the movement? Before that, the desktop uses float x = Input.GetAxis("Horizontal"); float z= Input.GetAxis("Vertical"); now the mobile uses a joystick, i.e. the movement value of the joystick in the X and Z directions is passed to float x,float z, that is Yes;
Then something bothered me for a day happened. When I used the left joystick to control the movement of the characters, and I clicked the attack button on the left to attack, there was a conflict in the Touch control. As long as I clicked the attack button, the left joystick turned to the direction of the button I clicked on the right hand. I was puzzled why I could not simultaneously click the virtual joystick on the left to control the movement of the characters, and click the button on the right to control the movement Make character attack, I use keywords to search a lot of results, there are also my questions, but there is no clear answer (now think about it, because it's too simple.. emm), which I saw about the implementation of double rocker, I think it's a bit similar, it's Touch on both sides, and then I studied for a while, forehead, complexity, I don't understand it very much, headache, I just want to click on both sides to achieve the corresponding functions normally, and when both sides click at the same time, there will be no conflict; then I have to search the Touch related information, there's really no way, no way Want to learn to also want to learn, finally or in the double rocker implementation of that code, I read it several times, suddenly thought,, no, my side is because I did not open multi Touch!!! Then I want to scroll with the mouse wheel to control the zoom of the view angle like the desktop. Finally, combined with the big guy's code, I divide the screen into three parts: the display and control of the virtual rocker on the left, the zoom control of the view angle with two fingers in the middle, and the click of the button on the right;
The code is as follows:
(1) player movement control:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class EasyTouchMove : MonoBehaviour{ //Maximum radius of rocker movement public float maxRadius = 100; //Initialize background icon location public Transform moveBackPos;//Virtual rocker background position (rocker chassis) public Transform joy; //Virtual rocker position private Vector2 moveCenter; //Property accessor of hor,ver private float horizontal=0; private float vertical=0; public float Horizontal { get { return horizontal; } } public float Vertical { get { return vertical; } } void Start(){ moveCenter = joy.position; Input.multiTouchEnabled = true;//Turn on multi touch } void Update () { horizontal = (joy.position.x - moveCenter.x)/100; vertical = (joy.position.y - moveCenter.y)/100; if (Input.touchCount <= 0) return; if (Input.touchCount >= 1) { //Record the touch information of each finger for (int i = 0; i < Input.touchCount; i++) { //When the touch is in the left area, the left controls the virtual rocker to control the player's movement if (Input.touches[i].position.x < Screen.width*0.3f) { //As long as the left area is touched, no matter how much Input.touchCount is equal to, the following will be executed if (Input.touches [i].phase == TouchPhase.Began) { moveCenter = Input.touches [i].position;//Moving point position is touch point position moveBackPos.gameObject.SetActive (true);//Show rocker background moveBackPos.position = moveCenter;//Rocker background position = moving point position joy.position = moveCenter;//Rocker position = move point position } //Finger touch movement if (Input.touches [i].phase == TouchPhase.Moved) { Vector2 oppsitionVec = (Vector2)Input.touches [i].position - moveCenter; //Moving vector float length = Vector3.Magnitude(oppsitionVec); //Vector length float radius = Mathf.Clamp(length,0,maxRadius);//Limit radius = length and 0 < = length < = maxradius joy.position = moveCenter + oppsitionVec.normalized * radius; } //Finger touch away if (Input.touches [i].phase == TouchPhase.Ended) { joy.position = moveCenter; joy.localPosition = Vector3.zero; moveBackPos.gameObject.SetActive (false); } } } } } }
Then modify it in the character movement control script
public EasyTouchMove etmoveļ¼
void FixedUpdate () {
//float x = Input.GetAxis("Horizontal");
//float z = Input.GetAxis ("Vertical");
float x = etmove.Horizontal;
float z = etmove.Vertical;
(2) Visual field control
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AndoridTouchCamera : MonoBehaviour { private int isforward; //Zoom in / out //Old and new positions of two fingers private Vector2 oldPos1 = new Vector2(); private Vector2 oldPos2 = new Vector2(); private Vector2 newPos1 = new Vector2(); private Vector2 newPos2 = new Vector2(); //Used to determine whether to enlarge bool isEnlarge (Vector2 oldPos1,Vector2 oldPos2,Vector2 newPos1,Vector2 newPos2) { float Pos_X1 = oldPos1.x - oldPos2.x; float Pos_Y1 = oldPos1.y - oldPos2.y; float length1 = Mathf.Sqrt (Pos_X1 * Pos_X1 + Pos_Y1 * Pos_Y1); float Pos_X2 = newPos1.x - newPos2.x; float Pos_Y2 = newPos1.y - newPos2.y; float length2 = Mathf.Sqrt (Pos_X2 * Pos_X2 + Pos_Y2 * Pos_Y2); if (length1 < length2) return true;//Enlarge gesture else return false;//Gesture reduction } void Start(){ Input.multiTouchEnabled = true;//Turn on multi touch } void Update(){ if (Input.touchCount <= 0) return; if (Input.touchCount == 1) return; if (Input.touchCount > 1) { //Record the movement distance of two fingers per frame Vector2 deltaDis1 = new Vector2 (); Vector2 deltaDis2 = new Vector2 (); for (int i = 0; i < 2; i++) { Touch touch = Input.touches [i]; //Limit your touch, if (touch.position.x>(0.33f*Screen.width)&&touch.position.x<(0.67*Screen.width)) { if (touch.phase == TouchPhase.Ended) //Fingers out of touch break; if (touch.phase == TouchPhase.Moved) { //Fingers in touch movement if (i == 0) { //Record the new position of the first finger newPos1 = touch.position; deltaDis1 = touch.deltaPosition; } else { //Record the new position of the second finger newPos2 = touch.position; deltaDis2 = touch.deltaPosition; if (isEnlarge (oldPos1, oldPos2, newPos1, newPos2)) //Zoom in, zoom in isforward = -1; else isforward = 1; } //Backup last touch position for comparison oldPos1 = newPos1; oldPos2 = newPos2; } //Zoom angle //Calculate the distance between new and old touch points float dis = Mathf.Abs(deltaDis1.x+deltaDis2.x)+Mathf.Abs(deltaDis1. y+deltaDis2.y); //Limit the degree of view zoom if (Camera.main.fieldOfView >= 30 && Camera.main.fieldOfView <= 90) { //Control zoom of field of vision according to gesture Camera.main.fieldOfView += isforward * (dis / 10); if (Camera.main.fieldOfView < 30) Camera.main.fieldOfView = 30; if (Camera.main.fieldOfView > 90) Camera.main.fieldOfView = 90; } } } } } }