摇杆控制人物移动

news2024/11/19 13:40:58

摇杆控制人物移动

  • 一、UI搭建
  • 二、3d模型搭建
  • 三、脚本
    • JoyStickBar.cs
    • PlayerController.cs
  • 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm=1001.2014.3001.5503)

一、UI搭建

在这里插入图片描述

JoyStickBar是图片背景
在这里插入图片描述
在这里插入图片描述
JoyStickPoint是图中心的拖拽物体
在这里插入图片描述
在这里插入图片描述
JoystickPointer是空物体为Image方向位移
在这里插入图片描述
在这里插入图片描述
Image是箭头
在这里插入图片描述
在这里插入图片描述
JoyStickRadiu是提供拖拽物体与背景图的距离,也就是背景图(大圆)的半径,将其位置移动到背景图的最左边缘
在这里插入图片描述
在这里插入图片描述

二、3d模型搭建

在这里插入图片描述
在这里插入图片描述

三、脚本

JoyStickBar.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class JoyStickBar : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler {

    /// <summary>
    /// 最大半径
    /// </summary>
    public float maxRadius;

    /// <summary>
    /// 计算中的半径
    /// </summary>
    public float radius;

    /// <summary>
    /// 原始位置
    /// </summary>
    private Vector2 originalPos;

    /// <summary>
    /// 遥杆中心位置
    /// </summary>
    public Transform joystickradius;

    /// <summary>
    /// 箭头指针方向
    /// </summary>
    public Transform joystickpointer;

    #region 方向控制访问器

    /// <summary>
    /// 水平方向
    /// </summary>
    private float horizontal = 0;

    /// <summary>
    /// 垂直方向
    /// </summary>
    private float vertical = 0;

    /// <summary>
    /// 水平方向属性访问器
    /// </summary>
    public float Horizontal
    {
        get { return horizontal; }
    }

    /// <summary>
    /// 垂直方向属性访问器
    /// </summary>
    public float Vertical
    {
        get { return vertical; }
    }
    
    #endregion

    private void Start()
    {
        if (!joystickradius) return;
        originalPos = transform.position;
        maxRadius = - joystickradius.localPosition.x;
        ShowPointer(false);
    }

    #region 方向受力

    /// <summary>
    /// 各个方向上的受力
    /// </summary>
    private void DirPotency()
    {
        horizontal = transform.localPosition.x;
        vertical = transform.localPosition.y;
    }

    #endregion

    #region 继承接口事件逻辑处理

    /// <summary>
    /// 开始拖拽
    /// </summary>
    /// <param name="eventData"></param>
    public void OnBeginDrag(PointerEventData eventData)
    {
        ShowPointer(true);
    }

    /// <summary>
    /// 拖拽中
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        //偏移量
        Vector2 dir = eventData.position - originalPos;
        //Vector2 dir = new Vector2 (Input.mousePosition.x, Input.mousePosition.y) - originalPos;

        //获取向量长度
        float distance = Vector3.Magnitude(dir);

        //获取当前
        radius = Mathf.Clamp(distance,0,maxRadius);

        //位置赋值
        transform.position = dir.normalized * radius + originalPos;

        //方向受力度量
        DirPotency();

        //角度转换
        CalculateAngle(dir.normalized);

    }

    /// <summary>
    /// 结束拖拽
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = originalPos;

        //当前半径
        radius = 0;

        //方向受力度量
        DirPotency();

        ShowPointer(false);
    }

    #endregion

    #region 指针逻辑
    
    /// <summary>
    /// 角度转换
    /// </summary>
    public void CalculateAngle(Vector2 dir)
    {
        if (!joystickpointer) return;
        float dot = Vector2.Dot(Vector2.up, dir);
        float angle = Vector2.Angle(Vector2.up,dir);
        joystickpointer.rotation = Quaternion.Euler(new Vector3(0, 0, -(dir.x>0?angle:-angle)));
    }

    /// <summary>
    /// 显示隐藏指针
    /// </summary>
    /// <param name="isshow"></param>
    public void ShowPointer(bool isshow)
    {
        joystickpointer.gameObject.SetActive(isshow);
    }

    #endregion

}

PlayerController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    /// <summary>
    /// 摇杆
    /// </summary>
    public JoyStickBar joy;

    /// <summary>
    /// 旋转速度
    /// </summary>
    public float rotatespeed = 10f;

    /// <summary>
    /// 移动速度
    /// </summary>
    public float moveSpeed = 5f;

	// Update is called once per frame
	void Update () {
        float hor = joy.Horizontal;
        float ver = joy.Vertical;

        Vector3 dir = new Vector3(hor,0,ver);

        if (dir != Vector3.zero)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), Time.deltaTime * rotatespeed);
            transform.Translate(Vector3.right * Time.deltaTime * moveSpeed * (joy.radius / joy.maxRadius));
        }

    }
}

工程在我资源里名字叫Joystickbar.unitypackage 连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB第86期】基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本

基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本 运行环境 windows10 matlab2020a catboost版本&#xff1a;catboost-1.1.1 往期&#xff1a; 【MATLAB第20期】基于matlab的Catboost多输入单输出回归预测模型 catboost-1.1.1版本 一、导入数据 采用12输…

sqlilabs第三十六三十七关

Less-36&#xff08;GET - Bypass MySQL_real_escape_string) 手工注入 单引号闭合&#xff08;单引号自动转换的编码变了直接输入%27&#xff09; 自动注入 和上一关一样 Less-37&#xff08;POST - Bypass MySQL_real_escape_string) 手工注入 这个也是碰到过的情况 接下…

WizFi360-EVB-Pico评估版介绍

文章目录 1 概述2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图(单位 : mm) 3.4 参考例程 1 概述 WizFi360-EVB-Pico基于树莓派RP2040&#xff0c;并使用WizFi360增加Wi-Fi连接。它与树莓派Pico板引脚兼容&#xff0c;可用于物联…

城市自贸区/经开区/产业园基于EasyCVR视频技术的可视化、移动化、智能化视频监管方案

一、背景需求 移动互联网的发展激发了用户对轻应用的使用习惯。4G、5G使得无线带宽快速提升&#xff0c;令大流量视频数据流逐渐从PC往手持终端转移。借助智能手持终端也可以实时查看、远程控制、存储录像、抓拍图像&#xff0c;能方便快捷地掌握所关注区域的视频动态。 随着…

prometheus api调用案例(代码+curl)

只有干货哦&#xff01; 目录 支持的api列表 代码调用 库 k8s集群下的prom 非容器部署的prom调用 curl调用 示例1&#xff1a;查询数据 示例2&#xff1a;热加载配置 示例3&#xff1a;主动删除数据 支持的api列表 源码位置&#xff1a;github.com\prometheus\client_…

鸿蒙操作系统:从手机到物联网,打造全场景智能体验

随着科技的不断发展&#xff0c;人们对于操作系统的需求也在不断升级。鸿蒙操作系统&#xff0c;作为华为推出的新一代智能终端操作系统&#xff0c;凭借其强大的分布式能力、流畅的用户体验以及丰富的应用生态&#xff0c;正逐渐成为人们关注的焦点。 一、鸿蒙操作系统概述 …

【论文笔记】BiFormer: Vision Transformer with Bi-Level Routing Attention

论文地址&#xff1a;BiFormer: Vision Transformer with Bi-Level Routing Attention 代码地址&#xff1a;https://github.com/rayleizhu/BiFormer vision transformer中Attention是极其重要的模块&#xff0c;但是它有着非常大的缺点&#xff1a;计算量太大。 BiFormer提…

AI数字人直播:引领直播行业新风潮,塑造新一轮“风口”

直播行业自从出现以来&#xff0c;就一直在不断地迭代和创新。而如今&#xff0c;随着AI技术的迅猛发展&#xff0c;AI数字人直播成为了一个崭新的赛道&#xff0c;引领着直播行业的新风潮&#xff0c;并有望塑造出新一轮的“风口”。 AI数字人直播&#xff0c;顾名思义&#…

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码&#xff1a;zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件…

python3遇到Can‘t connect to HTTPS URL because the SSL module is not available.

远程服务器centos7系统上有minicoda3&#xff0c;觉得太占空间&#xff0c;就把整个文件夹删了&#xff0c;原先的Python3也没了&#xff0c;都要重装。 我自己的步骤&#xff1a;进入管理员模式 1.下载Python3的源码&#xff1a; wget https://www.python.org/ftp/python/3.1…

平面灯阵中寻找最大正方形边界 - 华为机试真题题解

分值: 300分 题解: Java / Python / C++ 题目描述 现在有一个二维数组来模拟一个平面灯阵,平面灯阵中每个位置灯处于点亮或熄灭,分别对应数组每个元素取值只能为1或0,现在需要找一个正方形边界,其每条边上的灯都是点亮(对应数组中元素的值为1)的,且该正方形面积最大。 …

Linux第一个小程序-进度条(c语言版)

目录 行缓冲区概念&#xff1a; 行缓冲区代码演示&#xff1a; ​编辑进度条代码 1&#xff1a;memset函数&#xff1a; 2&#xff1a;const char* lable"|/-\\"; 3&#xff1a;usleep C语言 usleep 函数的功能和用法&#xff1a; 4&#xff1a;进度条代码的实…

设置视图的对齐方式

对齐方式 在XML文件中通过属性android:layout_gravity可以指定当前视图的对齐方向&#xff0c;当属性值为top时表示视图朝上对齐&#xff0c;为bottom时表示视图朝下对齐&#xff0c;为left时表示视图靠左对齐&#xff0c;为right时表示视图靠右对齐。如果希望视图既朝上又靠左…

全网最详细的TVBOX带会员版二开图文教程:一、tvbox如意前端后台搭建教程;二、tvbox后台配置教程;三、tvbox源码Android Studio配置修改教程;四、tvbox源码as打包教程

一、TVBOX管理后台源码网站搭建&#xff1b; 搭建测试环境&#xff1a;PHP7.0、Nginx、按照好宝塔、配置解析好域名 1、请将下载好的tvbox源码压缩包进行解压&#xff0c;解压后得到的问题件如图所示 2、请将压缩包内的如图所指文件&#xff08;1&#xff09;上传到你的网站…

【Java】SpringBoot快速整合WebSocket实现客户端服务端相互推送信息

目录 什么是webSocket&#xff1f; webSocket可以用来做什么? WebSocket操作类 一&#xff1a;测试客户端向服务端推送消息 1.启动SpringBoot项目 2.打开网站 3.进行测试消息推送 4.后端进行查看测试结果 二&#xff1a;测试服务端向客户端推送消息 1.接口代码 2.使…

Unity网格篇Mesh(二)

Unity网格篇Mesh&#xff08;二&#xff09; 介绍4.生成额外的顶点数据未计算法线计算法线没有法线vs有法线错误的UV坐标Clamping vs warpping正确的UV纹理&#xff0c;平铺&#xff08;1,1&#xff09; vs 平铺&#xff08;2,1&#xff09;凹凸不平的表面&#xff0c;产生了金…

SLAM算法与工程实践——相机篇:RealSense D435使用(1)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

layui(iconPickerFa)图标选择器插件,主要用于后台菜单图标管理

话不多说直接上代码 在页面中引入如下代码 <link rel"stylesheet" href"/template/admin/layui-v2.5.6/css/layui.css"> <script type"text/javascript" src"/template/admin/layui-v2.5.6/layui.js"></script> &…

LSTM的记忆能力实验

长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的特点是引入了一个新的内部状态&#xff08;Internal State) 和门控机制&#xff08;Gating Mechanism&#xff09;&am…

Java 将PDF 转为图片 工具 【Free Spire.PDF for Java】(免费版)

Java 将PDF 转为图片 使用工具&#xff1a;Free Spire.PDF for Java&#xff08;免费版&#xff09; Jar文件获取及导入&#xff1a; 方法1&#xff1a;通过官网下载jar文件包。下载后&#xff0c;解压文件&#xff0c;并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。 方…