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; } }
关键改动说明:
- 添加
Update方法:Unity的Update会在每帧执行,这里面用Input.GetMouseButtonDown(0)检测鼠标左键点击(0代表左键,1是右键,2是中键),只要满足条件就调用切换图片的方法。 - 优化条件判断:把原来的多个
if改成switch+取模,让循环切换的逻辑更清晰,也避免了重复代码。 - 可选移除按钮自身点击:如果你完全不需要按钮本身的点击响应,可以在
Start里移除按钮的OnClick监听,防止两种触发方式冲突。
注意事项:
- 确保挂载这个脚本的GameObject是激活状态,否则
Update不会执行。 - 如果你有多个这样的按钮,
spritenumber是静态变量会被所有实例共享,可能导致逻辑混乱,这种情况下建议把它改成非静态变量。 - 确认
PAUSESCRIPTE和soundmanagerscript的引用是正确的,避免空引用错误。
内容的提问来源于stack exchange,提问作者vaso




