上篇:(可供使用)下篇:(供学习者学习)

摇杆素材:
https://pan.baidu.com/s/1FdcLgPvvUIft7CWbHpmLbQ
提取码:22z9

UI阶段

步骤:
1.在Canvas下新建一个GameObject(空物体),命名为LeftButtomPin,锚点设置为左下,默认大小即可。
2.在LeftButtomPin下新建一个 image,将该 image 命名为 imgTouch,透明度设为0,宽高自己设置(推荐:Pox:200,Pox:165 Poz:0 Width:400 Height:330),作用:摇杆点击的触碰。
3.在 imgTouch 新建一个image,命名为 imgDirBg ,将摇杆背景赋给 imgDirBg. 大小自己设置。(后期会用到,这里本人是 Width 150 Height 150 )
4.在imageDirBg 下新建一个image ,命名为 imgDirPoint. 大小自己设置。(后期会用到,这里本人是 Width 50Height 50)
效果图:

代码阶段

代码脚本请按顺序复制粘贴。
新建第一个脚本:命名为PEListener, 用于监听按钮的触碰,不用挂给物体,此脚本为工具脚本

using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class PEListener : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{public Action<PointerEventData> onClickDown;  //监控按下的操作public Action<PointerEventData> onClickUp;   //监控抬起的操作public Action<PointerEventData> onDrag;     //监控按下拖拽的操作// 按下后会调用此方法,eventData 是所返回的参数,会反馈摇杆点的位置,方向信息.public void OnPointerDown(PointerEventData eventData){if (onClickDown != null){onClickDown(eventData);}}public void OnPointerUp(PointerEventData eventData){if (onClickUp != null){onClickUp(eventData);}}public void OnDrag(PointerEventData eventData){if (onDrag != null){onDrag(eventData);}}
}

新建第二个脚本:命名为WindowRoot, 用于监听按钮的触碰,不用挂给物体,此脚本为工具脚本

using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;public class WindowRoot : MonoBehaviour
{// 判断物体身上有没有摇杆组件
//   where T:Component 限定条件, 必须保证当前T的参数是 Component 的子类               protected T GetTOrAddComponect<T>(GameObject go) where T:Component{T t = go.GetComponent<T>();// 如果物体身上没有,则获取if (t == null) {t = go.AddComponent<T>();}return t;}#region Click Evtsprotected void OnClickDown(GameObject go,Action<PointerEventData> cb) {PEListener listener = GetTOrAddComponect<PEListener>(go);listener.onClickDown = cb;}protected void OnClickUp(GameObject go, Action<PointerEventData> cb){PEListener listener = GetTOrAddComponect<PEListener>(go);listener.onClickUp = cb;}protected void OnDrag(GameObject go, Action<PointerEventData> cb){PEListener listener = GetTOrAddComponect<PEListener>(go);listener.onDrag = cb;}#endregionprotected void SetActive(Image img, bool state = true){img.transform.gameObject.SetActive(state);}
}

新建第三个脚本:命名为Constants , 用于监听按钮的触碰,不用挂给物体,此脚本为工具脚本

public class Constants
{//屏幕标准宽高// 屏幕标准宽高 就是Canvas 的宽高public const int ScreenStandardWidth = 1334;public const int ScreenStandardHeight = 750;//摇杆点标准距离public const int ScreenOPDis = 65;
// 摇杆点的标准距离  也就是将摇杆点拖拽至摇杆背景边界时,摇杆点的 Pos Y 值;
// 这个值取决于 摇杆背景 和 摇杆点的大小
}


新建第四个脚本:命名为MainWnd, 赋给Canvas.

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class MainWnd : WindowRoot
{public Image imgTouch;    //触碰背景public Image imgDirBg;    //摇杆背景public Image imgDirPoint;  //摇杆点private float pointDis;   //自适应摇杆位置private Vector2 startPos = Vector2.zero; //摇杆点起始位置private Vector2 defaultPos = Vector2.zero;//摇杆点的初始位置private void Awake(){InitWnd();}private  void InitWnd(){pointDis = Screen.height * 1.0f / Constants.ScreenStandardHeight * Constants.ScreenOPDis; //当前屏幕实际的高度/标准屏幕高度*在标准情况下,摇杆点和摇杆背景间的长度defaultPos = imgDirBg.transform.position; //摇杆点的初始位置为 当前图片的位置SetActive(imgDirPoint, false);  //隐藏摇杆点RegisterTouchEvts();}public void RegisterTouchEvts(){OnClickDown(imgTouch.gameObject, (PointerEventData evt) => {startPos = evt.position;  // 按下时刻赋值摇杆点起始位置SetActive(imgDirPoint, true);   //按下去瞬间 激活摇杆点imgDirBg.transform.position = evt.position;});OnClickUp(imgTouch.gameObject, (PointerEventData evt) => {imgDirBg.transform.position = defaultPos; //手指抬起后,摇杆点的位置等于摇杆点的初始位置SetActive(imgDirPoint, false);  //手指松开后,隐藏摇杆点imgDirPoint.transform.localPosition = Vector2.zero; //摇杆点的位置复原 默认为0//TODO 方向信息Debug.Log(Vector2.zero);  //Vector.zero  没有方向});OnDrag(imgTouch.gameObject, (PointerEventData evt) => {Vector2 dir = evt.position - startPos;  //拖拽的向量 当前位置-初始位置(初始位置也就是按下时的位置)float len = dir.magnitude;if (len > pointDis){//  把这个方向长度 限制距离  (最小值,最大值)Vector2 clampDir = Vector2.ClampMagnitude(dir, pointDis);imgDirPoint.transform.position = startPos + clampDir; //当前的摇杆点位置 = 开始按下位置 + 方向向量限制完成后偏移的一个量}else{// 如果拖拽过程在摇杆背景内,则直接等于该距离imgDirPoint.transform.position = evt.position;}//TODO 方向信息Debug.Log(dir.normalized);  //Vector.zero  没有方向});}
}

最终效果图:

Unity中零基础实现人物控制摇杆(下篇)相关推荐

  1. 【贪玩巴斯】Unity3D初学圣经(三)—— unity中的基础概念——scene场景,component组件,assets文件夹和Material材质,Mesh Renderer与shader

    [贪玩巴斯]Unity3D初学圣经 三-- unity中的基础概念--scene场景,component组件与assets文件夹和Material材质以及Mesh Renderer 和 shader ...

  2. unity入门精要之第6 章 Unity 中的基础光照--环境光和自发光

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity 中的环境光和自发光 二.在Unity Shader 中实现漫反射光照模型 参考 前言 但这种模型有很多局限性.首先,有很 ...

  3. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  4. unity入门精要之第6 章 Unity 中的基础光照---实现高光反射光照模型

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 参考 前言 在6.2.4 节中,我们给出了基本光照模型中高光反射部分的计算公式: 从公式可以看出,要计算高光反射需要知道4 个参数:入射 ...

  5. 【unity游戏开发教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和动画,在unity中简单制作二次元人物动画

    前言 大家好!本期教程教大家在unity中制作二次元人物模型和动画 文章目录 前言 0.环境准备 1.下载VRoid Studio 2.Umotion Pro下载 3.Mixamo网站 4.blend ...

  6. Unity 中的基础光照

    通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑三种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交:一些光被物体吸收了,而另一些光被散射到其他方向. 最后,摄像 ...

  7. 在Unity中实现基础的MVC架构

    简介 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发,通过使用这种设计模式可以有效的实现各个功能的模块化,也可以更好地实现模块 ...

  8. 【Unity基础】人物控制的三种方式(键盘)、(鼠标)、(键鼠)

    先看效果: (键鼠): 人物会随着指针转动,WASD控制人物移动. 鼠标 键盘就是去除掉键鼠的看向鼠标指针,改成看向最后方向 代码: using System.Collections; using S ...

  9. unity入门精要之第6 章 Unity 中的基础光照概述-1

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 6.1 我们是如何看到这个世界的 6.2 标准光照模型 参考 前言 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说 ...

  10. 向左还是向右?Unity中俯视视角下人物智能转向的控制方法

    再利用动画控制人物移动的过程中,实现智能转向(自动判断向左还是向右转)功能的方法有许多种,效果不一而足,代码量也千差万别,在这里,博主给出以下四种可以实现转向方法以供参考 1.利用三维向量Vector ...

最新文章

  1. 电脑入门完全自学手册_电气自动化自学宝典——看过人人都是工程师
  2. 如何检查python的库是否安装成功_机器学习之Python编程库的安装
  3. ShellCode初体验
  4. IOS程序之发送短信代码实现
  5. 数据科学 第 5 章 主成分分析(降维)、相关性
  6. 畅捷通(chanjet)T1各版本
  7. 音频amr格式怎么转成mp3-几个步骤轻松搞定
  8. 什么是STL(模板库)?STL包含的一些内容及基础含义
  9. [Python36] 01 start
  10. stata图像绘制专题【计量经济系列(二)】
  11. linux下无线网卡做热点,用ArchLinux做wifi热点无线路由
  12. 使用Audacity软件分析浊音、清音、爆破音的时域及频域特性。
  13. [电脑驱动向]笔记本键盘失灵,电脑插耳机没反应,不要着急拿去物理维修,可能是bios驱动需要更新
  14. C语言(求最小公倍数的3种方法)
  15. 简述TCP三次握手,看不懂算我输!
  16. 中学计算机教师薪资,中学教师
  17. 计算一个字符串里面特定字符的个数
  18. 详解redis5.x版本
  19. WPF无弹窗打印_se7en3_新浪博客
  20. influxdb学习笔记

热门文章

  1. 通过动态NAT实现内网访问外网,通过静态NAT实现外网访问内网的WEB服务器
  2. cocos2d-JS 模块 anysdk 概述
  3. Android动画定时lnvaliate,Android6.0 MTK6737 启动流程 · Younix’s Studio
  4. 【0514 更新中】CVPR 2019 论文汇总 按方向划分
  5. 今日恐慌与贪婪指数为25 等级转为极度恐慌
  6. 格斗系统 - Universe Fighting Engine
  7. 基于JAVA藏宝阁游戏交易系统计算机毕业设计源码+系统+lw文档+部署
  8. 前端学习-JavaScript每日一题-数组扁平化
  9. 【Python基础知识整理】
  10. python爬虫-抓取内涵吧内涵段子