新建一个场景,尝试从零制作移动摇杆。
第一步:创建一个image。
第二步:设置相机纯色便于显示UI。
第三步:调整Canvas自适应屏幕,这里模拟竖屏游戏,屏幕1920*1080:
第四步:制作摇杆外框
第五步:同理,在外框内添加一个 摇杆按钮的image,并把整个摇杆框和按钮添加在一个空对象里。
第六步:新建文件夹TestScripts,新建脚本MobileJoystickTest并托给父对象空对象MobileJoystick
第七步:新建Zone的image作为可使用摇杆的范围,点击Rect的这个图标,按住Alt然后点最后一个,图片就会占据全屏。
第八步:因为我们只允许玩家半屏控制移动,所以点击Zone,按下F,拖上面的框到一半位置,并调节为黑色透明度20%:
第九步:层级设置以及测试脚本:
脚本写入测试方法:
第十步:使摇杆出现在点击的位置:
运行后发现,摇杆出现在我们点击的位置
第十一步:显隐摇杆,开始时隐藏摇杆,点击显示:
OK,跟着做到这一步之后,其实还有一些问题,比如点击之后摇杆不再隐藏之类的,完整脚本写在下方,希望你能通过自己的阅读代码能力学会这些:
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
public class MobileJoystickTest : MonoBehaviour
{
[Header(" 场景UI对象 ")]
[SerializeField]private RectTransform joystickOutline;//摇杆轮廓
[SerializeField]private RectTransform joystickKnob;//摇杆旋钮
[Header(" 设置")]
[SerializeField] private float moveFactor;//移动因子
private bool canControl;
private Vector3 clickedPosition;
private Vector3 move;
// Start is called before the first frame update
void Start()
{
HideJoystick();
}
// Update is called once per frame
void Update()
{
if(canControl)ControlJoystick();
}
public void CilckOnJoystickZoneCallback()
{
clickedPosition = Input.mousePosition;//定义变量获取鼠标位置
joystickOutline.position = clickedPosition;//摇杆位置改变
ShowJoystick();
}
//显隐控制
private void ShowJoystick()
{
joystickOutline.gameObject.SetActive(true);
canControl = true;
}
private void HideJoystick()
{
joystickOutline.gameObject.SetActive(false);
canControl = false;
}
//摇杆的控制
private void ControlJoystick()
{
Vector3 currentPosition = Input.mousePosition;
Vector3 direction = currentPosition - clickedPosition;
float moveMagnitude = direction.magnitude * moveFactor / Screen.width;
moveMagnitude = Mathf.Min(moveMagnitude , joystickOutline.rect.width / 2);
move = direction.normalized * moveMagnitude;
Vector3 target = clickedPosition + move;
joystickKnob.position = target;
if (Input.GetMouseButtonUp(0))
{
HideJoystick();
}
}
//使外界得到摇杆的移动变量
private Vector3 GetMoveVector()
{
return move;
}
}
仔细阅读其实能够发现很简单对吧,条理清晰