Unity实现虚拟摇杆
- 作者: xsword
- 来源: 51数据库
- 2021-08-28
本文实例为大家分享了unity实现虚拟摇杆的具体代码,供大家参考,具体内容如下

面板上设置一些属性,比如摇杆拖拽的距离,是否始终可视,是否限制虚拟摇杆位置(我是把虚拟摇杆限制在了屏幕的左下区域)。
使用getdirandlength()方法去获得移动的方向和长度即可

using unityengine;
/// <summary>
/// 虚拟摇杆管理器
/// </summary>
public class virtualjoystickmanager : monobehaviour
{
private static virtualjoystickmanager _instance;
public static virtualjoystickmanager instance
{
get
{
if (_instance == null)
{
_instance = findobjectoftype<virtualjoystickmanager>();
}
return _instance;
}
}
[header("是否始终可视")]
public bool alwaysvisible;//是否始终可视
[header("是否限制虚拟摇杆位置")]
public bool restrictvirtualjoystickpos;//是否限制虚拟摇杆位置
[header("虚拟摇杆物体")]
[header("==========")]
public gameobject virtualjoystick;//虚拟摇杆父物体
public gameobject inside;//内环
public gameobject outside;//外环
[header("最大拖拽距离")]
[header("==========")]
public float maxdraglength;//最大拖拽距离
private vector3 virtualjoystickcenter;//虚拟轴中心
private void update()
{
//如果限制虚拟轴位置并且虚拟轴位置超出了限制范围则不进行任何操作
if (restrictvirtualjoystickpos && judgeisvalidrange() == false)
{
return;
}
//更新显示
updateshow();
//更新虚拟摇杆位置
if (input.getmousebuttondown(0))
{
updatevirtualjoystickpos();
}
else if (input.getmousebuttonup(0))
{
inside.transform.position = virtualjoystickcenter;
}
//更新内环位置(限制拖拽范围)
if (input.getmousebutton(0))
{
updateinsidepos();
}
}
/// <summary>
/// 更新显示
/// </summary>
private void updateshow()
{
if (alwaysvisible)
{
inside.setactive(true);
outside.setactive(true);
}
else if (alwaysvisible == false)
{
if (input.getmousebuttondown(0))
{
inside.setactive(true);
outside.setactive(true);
}
if (input.getmousebuttonup(0))
{
inside.setactive(false);
outside.setactive(false);
}
}
}
/// <summary>
/// 更新虚拟摇杆位置
/// </summary>
private void updatevirtualjoystickpos()
{
//得到虚拟轴的中心位置
virtualjoystickcenter = screentoworld(input.mouseposition);
//设置虚拟轴的位置
virtualjoystick.transform.position = virtualjoystickcenter;
}
/// <summary>
/// 更新内环位置
/// </summary>
private void updateinsidepos()
{
inside.transform.position = screentoworld(input.mouseposition);
if (vector3.distance(inside.transform.position, virtualjoystickcenter) > maxdraglength)
{
vector3 normalizedpos = (inside.transform.position - virtualjoystickcenter).normalized;
inside.transform.position = normalizedpos * maxdraglength + virtualjoystickcenter;
}
}
/// <summary>
/// 判断是否为有效的范围
/// </summary>
/// <returns>是否为有效的范围</returns>
private bool judgeisvalidrange()
{
if (inside.activeinhierarchy)
{
return true;
}
vector2 v = input.mouseposition;
if (v.x > screen.width / 2 || v.x < 0)
{
return false;
}
else if (v.y > screen.height / 2 || v.y < 0)
{
return false;
}
return true;
}
/// <summary>
/// 屏幕坐标转世界坐标
/// </summary>
/// <param name="screenpos">屏幕坐标位置</param>
/// <param name="camera">相机</param>
/// <returns>转换后的世界坐标</returns>
public static vector3 screentoworld(vector3 screenpos, camera camera = null)
{
if (camera == null)
{
camera = camera.main;
}
vector3 _screenpos = new vector3(screenpos.x, screenpos.y, -camera.transform.position.z);
vector3 v = camera.screentoworldpoint(_screenpos);
return v;
}
/// <summary>
/// 得到运动的方向和长度
/// </summary>
/// <returns>方向和长度</returns>
public vector3 getdirandlength()
{
return inside.transform.position - virtualjoystickcenter;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
