You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D安卓构建中Raycast触摸怪物移动功能失效问题求助

Unity安卓打包后怪物触摸移动功能失效的解决方案

核心问题:鼠标事件与移动端触摸事件的兼容性

你当前代码用的Input.GetMouseButtonDown(0)和Input.mousePosition是针对鼠标输入的API,虽然Unity编辑器会把触摸操作模拟成鼠标事件,但打包到安卓真机后,触摸事件的处理逻辑和鼠标有差异,容易导致检测失效。

修复方案:替换为移动端触摸输入API

把代码中的鼠标输入逻辑替换为触摸事件检测,修改后的代码如下:

if (IsClickMonster)
{
    // 检测第一个触摸的开始事件
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
    {
        // 使用触摸位置生成射线
        Ray MoveClick = cam.ScreenPointToRay(Input.GetTouch(0).position);
        if (Physics.Raycast(MoveClick, out ClickedPosition, float.MaxValue, whatCanbeClickedOn) 
            && !ClickedPosition.collider.gameObject.CompareTag("monster"))
        {
            Debug.Log("Monster is Moving!");
            clickEffect.transform.position = new Vector3(ClickedPosition.point.x, ClickedPosition.point.y + 1.0f, ClickedPosition.point.z);
            StopCoroutine("MonsterMove");
            IsMoving = true;
            StartCoroutine("MonsterMove");
        }
        else
        {
            clickEffect.SetActive(false);
            StopCoroutine("MonsterMove");
            IsClickMonster = false;
            return;
        }
    }
}
else
{
    return;
}

额外排查点

  • 检查IsClickMonster的触发逻辑:如果触发IsClickMonster的代码也是用鼠标事件(比如Input.GetMouseButtonDown检测怪物点击),同样要替换为触摸事件检测,否则安卓下根本无法激活这个状态。
  • 层级遮罩验证:确认whatCanbeClickedOn层级遮罩包含了地面(目标点所在的碰撞体层级),排除怪物层级的同时不要漏了可点击的地面层。
  • 相机设置:确保cam引用的是场景中的主相机,并且相机的Culling Mask包含了地面和怪物的层级,避免射线无法检测到碰撞体。
  • UI遮挡:如果场景中有UI元素,检查这些UI的Canvas组件是否勾选了Blocks Raycasts,如果不需要遮挡触摸,取消勾选该选项。
  • 真机测试:尽量用安卓真机测试,部分模拟器的触摸模拟存在兼容性问题,会导致检测失效。

(配图:骷髅士兵移动示意图,白色点clickEffect为触摸位置ClickedPosition)

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:45