首页 > 其他分享 >Unity2D 模拟手柄实现玩家移动

Unity2D 模拟手柄实现玩家移动

时间:2024-05-12 20:30:15浏览次数:21  
标签:return Unity2D 手柄 Vector2 玩家 player curPointerObj null public

1,创建控制器UI

2,挂载脚本

3,脚本编写

  • 基本要素

    [Tooltip("玩家游戏体")]
    public Rigidbody2D player;
    [Tooltip("玩家速度")]
    public float speed = 1f;
    [Tooltip("玩家动画")]
    public Animator animator;

    public enum Mode {
        BUTTON,
        ROCKER,
    }
    [Tooltip("模式")]
    public Mode mode = Mode.ROCKER;
  • 模式切换---在Start()方法中根据mode的值,设置相关物体的Active
  • 基本移动逻辑
因为需要不断的更新移动(长按不松开),而Update方法每帧都在执行,所以在Update方法中执行移动操作。
void Update()
{
    doMove();
}
  • 具体移动逻辑
private void doMove()
{
    if (player == null) {
        return;
    }
    // 获取方向
    Vector2 dir = getDir();
    if (dir == Vector2.zero) return;

    Vector2 pos = player.position;
    // 10是随便设置的一个控制值,不然太慢
    pos.y += Time.deltaTime * speed * 10 * dir.y;
    pos.x += Time.deltaTime * speed * 10 * dir.x;
    
    player.MovePosition(pos);
}

private Vector2 getDir()
{
    if (mode == Mode.BUTTON)
    {
        if (curPointerObj == null) return Vector2.zero;
        switch(curPointerObj.name)
        {
            case "Up":
                return Vector2.up;
            case "Down":
                return Vector2.down;
            case "Left":
                return Vector2.left;
            default:
                return Vector2.right;
        }
    }

    return rockerDir;
}

3.1,按钮模式实现

  • 基本逻辑
监听触摸事件,按下(IPointerDownHandler)为开始移动,抬起(IPointerUpHandler)为结束移动,实现按下按钮并松开的移动过程。
3.1.1,脚本
// 值为当前按下的按钮
private GameObject curPointerObj = null;
  • 按下
public void OnPointerDown(PointerEventData eventData)
{
    if (player == null || mode != Mode.BUTTON) {
        return;
    } 
    GameObject pointerObj = eventData.pointerEnter;
    if (curPointerObj != null) {
        return;
    }
    curPointerObj = pointerObj;
}
  • 抬起
public void OnPointerUp(PointerEventData eventData)
{
    if (player == null || mode != Mode.BUTTON) {
        return;
    } 
    GameObject pointerObj = eventData.pointerEnter;
    if (curPointerObj == null || curPointerObj != pointerObj) {
        return;
    }
    curPointerObj = null;
}

3.2,摇杆模式实现

  • 基本逻辑
监听拖拽事件,拖拽中(IEndDragHandler)为开始/移动中,拖拽结束(IDragHandler)为结束移动,实现拖拽并松开的移动过程。
3.1.1,脚本
// 摇杆内部可拖拽部分
private RectTransform rockerInnerTransform;
// 摇杆外部不可拖拽部分-边界
private RectTransform rockerOuterTransform;
// 当前摇杆方向
private Vector2 rockerDir = Vector2.zero;
  • 拖拽中
public void OnDrag(PointerEventData eventData)
{
    if (player == null || mode != Mode.ROCKER) return;

    Vector2 pos = Camera.main.ScreenToWorldPoint(eventData.position);
    
    Vector2 rockerOriginPosition = rockerOuterTransform.position;
    // 拖拽方向
    rockerDir = (pos - rockerOriginPosition).normalized;
    
    float distance = Vector2.Distance(pos, rockerOriginPosition);

    if (distance <= 1.5f) // 1.5f刚好是摇杆外部边界和摇杆内部可拖拽部分中心重合时的距离
    {
        rockerInnerTransform.position = pos;
    }
    else
    {
        Vector2 dir = pos - rockerOriginPosition;
        // 拖拽超过摇杆外部边界时,摇杆内部可拖拽的位置为:外部中心 + 当前拖拽方向指定的拖拽距离位置(此时设置为1.5f,到达边界)。
        rockerInnerTransform.position = rockerOriginPosition + dir.normalized * 1.5f;
    }
}
  • 拖拽结束
public void OnEndDrag(PointerEventData eventData)
{
    if (player == null || mode != Mode.ROCKER) return;

	// 恢复方向和位置
    rockerDir = Vector2.zero;
    rockerInnerTransform.position = rockerOuterTransform.position;
}

标签:return,Unity2D,手柄,Vector2,玩家,player,curPointerObj,null,public
From: https://www.cnblogs.com/j-tree/p/18188131

相关文章

  • Unity2D横版游戏之平台跳跃效果
    Unity2D横版游戏之平台跳跃效果简单介绍平台跳跃效果。玩家允许在平台下方跳跃到平台上方,并且可以在平台上方站立,同时玩家在平台上方允许通过下跳操作到达平台下方。实现步骤(一)将玩家的图片设置为Player、将平台的图层设置为Platform。(二)为平台游戏对象创建XXXCollider2D......
  • Unity2D横板游戏之背景视差与无限滚动效果
    Unity2D横板游戏之背景视差与无限滚动效果简单介绍背景视差效果。在2D横板游戏中,由若干个背景图片构成的背景,在背景移动的过程中,每一个背景图片的移动速度均不同,靠近玩家的背景图片移动速度快,而远离玩家的背景图片移动速度慢,从而形成背景的视差效果,使背景更加立体且富有层级。......
  • 二十一点玩家策略分析
    二十一点玩家策略分析我从很早开始就对二十一点(BlackJack)这个游戏感兴趣了,应该是从看了决胜21点这个电影开始的吧。前两天,我开始思考,是否真的存在电影中所说的某种方法,来降低庄家的优势,甚至战胜庄家呢?答案是确实存在某种方法降低庄家优势,但战胜庄家是不可能的。或许在过去......
  • 玩家角色——跳上平台
    目的玩家可以直接跳上平台思路将平台的物品类型设置为一个新的类型角色跳跃的时候使其胶囊体的碰撞通道可以忽略这个平台的类型角色下落时(Tick)通过射线检测下方是否是平台类型的物件,如果是则开启碰撞1.设置一个新的平台类型2.玩家角色跳跃时忽略该类型碰撞3.编写一个......
  • 道具——玩家近战攻击升级
    目的玩家拾取物的一种玩家拾取后会增加玩家的近战攻击的伤害和攻击范围思路和技能拾取物的逻辑一致,但更加简单通过修改玩家的攻击数值和伤害判定范围以及特效显示范围的参数来达成目的1.新建攻击升级拾取物蓝图通过接口事件制作2.玩家角色蓝图中实现接口3.在角色动......
  • UI——玩家HUD
    目的创建HUD控件蓝图玩家角色蓝图中调用HUD结果1.创建HUD控件蓝图设计UI(详略)构造函数中获取玩家蓝图(方便之后的调用)编写通信逻辑,玩家血量变化的文字注意:文本格式化的语法固定文字+{参数名字}2.玩家角色蓝图中调用HUD初始化HUD在受击事件的宏中关联玩家血量百分......
  • 玩家——玩家格挡
    目的:玩家死亡动画调用创建护盾蓝图玩家角色蓝图中编写护盾启用逻辑创建护盾CDUI玩家角色蓝图中护盾CD1.玩家死亡动画的调用2.创建护盾蓝图3.玩家角色蓝图中编写护盾启用逻辑4.创建护盾CDUI5.玩家角色蓝图中实现护盾CD初始化UI......
  • 攻击类型判断——玩家射击对DC131无效
    目标创建接口并编写接口逻辑(核心)启用DC131的“玩家远程攻击无效”思路使用接口代替系统自带的`ApplyDamage`节点,作为攻击传递将玩家攻击使用列举分为近战和远程两种攻击敌人在接收伤害时会判断玩家的攻击类型使DC131免疫玩家的远程攻击1.创建接口并编写接口逻辑创建......
  • 混辗式混砂机 变速箱 旋耕灭茬机 污水处理 150T液压机 污水处理厂 饺子机 农村生活污
    UHT管式杀菌机说明书混辗式混砂机机械结构设计 论文CAD图纸开题报告毕业设计之专用机床图纸毕业设计推钢机液压图纸毕业设计3吨叉车3进3退变速箱(毕业设计)1G-160型旋耕灭茬机中央传动装置设计(共17张CAD加说明书与侧边传动装置配套污水处理课程设计图集150T液压机设计【10......
  • 2024年4月6日-UE5-拉怪机制,怪物攻击玩家、伤害源、黑板
    先选择一个怪物攻击的动画序列,转换为蒙太奇 打开怪物总类,添加自定义事件,把网格体拖下来 然后打开AI行为树加一个selector,意思是先走左边的,走不到再走右边的 然后新建一个怪物黑板 打开黑板,新建一个目标玩家  添加一个序列,然后把装饰器选成黑板,再把目标改成我......