抖音开放平台Logo
开发者文档
控制台
  • 体验抖音小游戏
  • 游戏引擎
  • Unity 引擎适配
  • WebGL 方案与优化
  • WebGL适配方案
  • 性能优化
  • 版本更新与资源部署
  • 能力适配
  • 加载外部js文件的支持
  • 使用新文件系统说明
  • 屏幕适配
  • 键盘输入法适配
  • 后端服务指引
  • 网络通信适配
  • 多点触控适配
  • 音频适配
  • Android WebGL2.0支持
  • 问题反馈
  • 方案概述与兼容性
  • BGDT 手册
  • 接入
  • C# API
  • Cocos/Laya/Egret引擎适配
  • 基础功能
  • 开放能力
  • 性能优化
  • 此文档描述小游戏开发时多点触控适配问题。
    本文档说明 WebGL 方案下对多点触控的适配。供有多点触控需求、并且在 iOS 环境下实际遇到了按键粘连或触控/点击事件丢失问题的游戏参考接入。

    开发参考

    重载触控

    根据项目使用的 UI 方案参考对应的小节进行接入。

    UGUI

    如果项目使用 Unity 自带的 UGUI 作为 UI 解决方案,需要重载 EventSystem,参考本小节步骤接入。
      1.在 Unity 场景内找到 EventSystem,挂载 StarkInputOverrideBypass 组件。
      2.构建发布测试。

    FairyGUI

    如果项目使用 FairyGUI 作为 UI 解决方案,需要重载 EventSystem 和 Input,参考本小节步骤接入。
      1.在 Unity 场景内找到 EventSystem,挂载 StarkInputOverrideBypass 组件。
      如果没有 EventSystem,请先手动创建一个 Empty Object,添加 EventSystem 组件。
      2.在 Project Settings - Player 中,切换到 WebGL 页签。
      找到 Scripting Define Symbols,点加号添加 STARK_UNITY_INPUT_OVERRIDE ,并点击 Apply 保存。
      3.首次触控操作前,手动启用 FairyGUI 的触屏能力。
    FairyGUI.Stage.touchScreen = true; // 在首次触控操作前调用,否则 Began 事件会丢失。
      4.构建发布测试。

    其他说明

    对 Event System 的重载启用(且 StarkInputOverrideBypass 上勾选 DebugTraceEnabled 时)会输出日志:
    StarkInputOverrideBypass enabled.
    对全局 Input 的重载启用时,会输出日志:
    Global Input overridden by StarkSDK.
    影响范围:
    使用方式
    是否受重载影响
    参考接入方式
    UGUI
    UGUI
    IPointerDownHandler
    UGUI
    FairyGUI
    STARK_UNITY_INPUT_OVERRIDE 存在时影响
    FairyGUI
    using UnityEngine;
    Input.GetTouch()
    STARK_UNITY_INPUT_OVERRIDE 存在时影响
    FairyGUI
    UnityEngine.Input.GetTouch()
    /
    使用其他 UI 方案时,可根据其监听点击事件的方式,尝试按 UGUI 或 FairyGUI 的步骤配置。如果触控粘连的问题仍存在,可参考“手动监听”小节。

    手动监听

    如果上述接入方式无法满足需求,可以考虑手动监听。
    通过直接监听原始 Touch 事件、获取每个点的 Touch Phase 来定制操控逻辑。

    接口参考

    这套 API 仅在 WebGL 环境中有效,可以手动监听触控事件。支持的触控事件有 TouchStartTouchMoveTouchEndTouchCancel
    public class StarkInput { /// <summary> /// 监听开始触摸事件 /// </summary> public void OnTouchStart(TouchEventCallback callback); /// <summary> /// 监听触点移动事件 /// </summary> public void OnTouchMove(TouchEventCallback callback); /// <summary> /// 监听触点结束事件 /// </summary> public void OnTouchEnd(TouchEventCallback callback); /// <summary> /// 监听触点失效事件 /// </summary> public void OnTouchCancel(TouchEventCallback callback); /// <summary> /// 取消监听开始触摸事件 /// </summary> public void OffTouchStart(TouchEventCallback callback = null); /// <summary> /// 取消监听触点移动事件 /// </summary> public void OffTouchMove(TouchEventCallback callback = null); /// <summary> /// 取消监听触点结束事件 /// </summary> public void OffTouchEnd(TouchEventCallback callback = null); /// <summary> /// 取消监听触点失效事件 /// </summary> public void OffTouchCancel(TouchEventCallback callback = null); }

    使用示例

    // 监听 TouchStart 事件 StarkSDK.API.GetStarkInput().onTouchStart((StarkTouchEvent touchEvent) => { Debug.Log("touchstart: " + touchEvent); });

    实现原理

    事件监听

      StarkSDK.API.GetStarkInput() 的触控事件监听接口由 JS 基础库单独提供,无事件粘连问题。

    UGUI

      StarkInputOverrideBypass 组件启用时,会重载 Event System 中 Input Module 的 Touch 相关行为。
      该组件的事件由 StarkSDK.API.GetStarkInput() 提供。
      该重载不影响 UnityEngine.Input

    FairyGUI

      定义了 STARK_UNITY_INPUT_OVERRIDE 符号的状态下,全局命名空间中会存在一个与 UnityEngine.Input 等价且同名的 Input 实现。
      Input 实现与 StarkInputOverrideBypass 组件配合使用,能够重载 Input.touches, Input.GetTouch() 等属性和方法。编译时,业务代码中对 Input 而非显式指定 UnityEngine.Input 的引用,会定向至该 Input 实现。
      该重载仅影响对 Input 的直接引用,不影响 UnityEngine.Input