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
相关产品推荐
相关产品推荐

