You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity新手求助:如何点击屏幕任意位置切换按钮图片

实现点击屏幕任意位置切换Unity UI按钮图片

嘿,我来帮你搞定这个问题!你之前尝试用Input.GetMouseButtonDown(0)没成功,核心原因是这个输入检测需要在每帧运行的方法(比如Update)里执行,而你原来的脚本只靠按钮的OnClick事件触发changeButton,没有持续检测屏幕点击的逻辑。

下面是修改后的完整脚本,我标注了关键改动点:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Button))]
public class OnClickScript : MonoBehaviour {
    public static int spritenumber=1;
    public Button mybutton;
    public Sprite square;
    public Sprite circle;
    public Sprite triangle;
    public int counter = 1;

    void Start() {
        mybutton = GetComponent<Button>();
        // 可选:如果不需要按钮自身的点击响应,可以移除原来的OnClick绑定
        // mybutton.onClick.RemoveAllListeners();
    }

    void Update() {
        // 每帧检测是否点击了屏幕左键,且游戏未暂停
        if (Input.GetMouseButtonDown(0) && !PAUSESCRIPTE.isPaused) {
            changeButton();
        }
    }

    public void changeButton() {
        counter++;
        // 用取模优化循环逻辑,比多个if更简洁
        switch (counter % 3) {
            case 1:
                mybutton.image.overrideSprite = square;
                spritenumber = 1;
                soundmanagerscript.PlaySound("buttonpress");
                break;
            case 2:
                mybutton.image.overrideSprite = circle;
                spritenumber = 2;
                soundmanagerscript.PlaySound("buttonpress");
                break;
            case 0: // 模3等于0对应原来的counter=3的情况
                mybutton.image.overrideSprite = triangle;
                spritenumber = 3;
                soundmanagerscript.PlaySound("buttonpress");
                break;
        }
        // 保持counter在1-3循环,也可以用上面的取模替代,这里留着兼容原来的逻辑
        if (counter > 3) counter -= 3;
    }
}

关键改动说明:

  1. 添加Update方法:Unity的Update会在每帧执行,这里面用Input.GetMouseButtonDown(0)检测鼠标左键点击(0代表左键,1是右键,2是中键),只要满足条件就调用切换图片的方法。
  2. 优化条件判断:把原来的多个if改成switch+取模,让循环切换的逻辑更清晰,也避免了重复代码。
  3. 可选移除按钮自身点击:如果你完全不需要按钮本身的点击响应,可以在Start里移除按钮的OnClick监听,防止两种触发方式冲突。

注意事项:

  • 确保挂载这个脚本的GameObject是激活状态,否则Update不会执行。
  • 如果你有多个这样的按钮,spritenumber是静态变量会被所有实例共享,可能导致逻辑混乱,这种情况下建议把它改成非静态变量。
  • 确认PAUSESCRIPTEsoundmanagerscript的引用是正确的,避免空引用错误。

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

火山引擎 最新活动