unity实现鼠标点击自定义特效

时间:2023-08-09 15:57:32来源:程序员客栈

前言

最近在优化项目,策划提了一个需求,需要实现一个通用点击特效。

尝试1

首先想到的是改变鼠标指针样式,这个以前学过,还有点印象,以前刚开始学unity的时候,记得看到过一个方法可以改变游戏中鼠标指针样式。方法如下:选择“Edit”——>“Project Setting”,打开项目设置

一顿操作后发现,这个只能将鼠标样式改为image,可现在美术给的是粒子特效,这可把我给难住了。


(相关资料图)

尝试2

突然想到,unity不是有监听鼠标点击的方法,监听到鼠标点击时,就可以实例化一个特效,播放完销毁。思路有了,做起来就简单了。1.首先需要实有个update方法能实时监测

functionthis.onclick()UpdateBeat:Add(this.updata,this)endfunctionthis.updata()end

2.接着需要实现监测是否有鼠标点击

localInput=UnityEngine.InputifInput.GetMouseButtonDown(0)thenend

3.检测到后需要计算出特效的位置

localx=(Input.mousePosition.x-Screen.width/2)*resolutiManager:GetScreenSize().x/Screen.widthlocaly=(Input.mousePosition.y-Screen.height/2)*resolutiManager:GetScreenSize().y/Screen.height

4.在指定的位置实例化特效

ifnotutils.findchild(prant,"UI_dianji(Clone)")thenlocalprant=GameObject.Find("UIRoot").transformlocalOpEffect=poolManager.AddObj("Effect/Prefabs/UI/UI_dianji.prefab",prant)OpEffect.transform.localPosition=Vector3.New(x,y,0)SetActive(OpEffect,true)Util.DestroyDelay(OpEffect,0.3)end

完成代码如下:

localInput=UnityEngine.Inputfunctionthis.onclick()UpdateBeat:Add(this.updata,this)endfunctionthis.updata()ifInput.GetMouseButtonDown(0)thenlocalprant=GameObject.Find("UIRoot").transformlocalx=(Input.mousePosition.x-Screen.width/2)*resolutiManager:GetScreenSize().x/Screen.widthlocaly=(Input.mousePosition.y-Screen.height/2)*resolutiManager:GetScreenSize().y/Screen.heightifnotutils.findchild(prant,"UI_dianji(Clone)")thenlocalOpEffect=poolManager.AddObj("Effect/Prefabs/UI/UI_dianji.prefab",prant)OpEffect.transform.localPosition=Vector3.New(x,y,0)SetActive(OpEffect,true)Util.DestroyDelay(OpEffect,0.3)endendend

在需要的地方调用onclick方法即可。

效果 优化

上面实例化和销毁太频繁了,考虑做成显示隐藏。start方法里获取特效物体

functionview:start()ui.clickEff=base:findobj("clickEff")end

完整代码

localInput=UnityEngine.Inputfunctionview:start()ui.clickEff=base:findobj("clickEff")endfunctionthis.onclick()UpdateBeat:Add(this.updata,this)endfunctionthis.updata()ifInput.GetMouseButtonDown(0)thenself.clickEff.gameObject:SetActive(false)localx=(Input.mousePosition.x-Util.ScreenWidth()/2)*ResolutiManager:GetScreenSize().x/Util.ScreenWidth()localy=(Input.mousePosition.y-Util.ScreenHeight()/2)*ResolutiManager:GetScreenSize().y/Util.ScreenHeight()self.clickEff.parent.localPosition=Vector2(x,y)self.clickEff.gameObject:SetActive(true)endend

福利

首先,感谢北京大学出版社为 "爱上游戏开发" 提供的书籍赞助,非常感谢!后续公众号头条推文,也会有送书活动,大家记得看完文章后,多多参与送书哈,混脸熟也能中奖!

《Unity手机游戏开发:从搭建到发布上线全流程实战》

本书将以一款开放世界类游戏的实践过程为主线,为读者呈现从零开始上线一款游戏的实践路线、游戏引擎Unity的开发模式,以及游戏开发的核心框架。

?参与方式:

添加小编微信,进技术交流群抢红包,运气王可免费获赠上述书籍一本,活动时间4月13日-16日,不定时发红包,快来积极参与吧!

tips:没加小编微信的先加一下小编微信,方便拉你进群参与抽奖及中奖之后安排发货哟~

-- END--

unity实战之循环列表item渐显

unity使用TextMeshPro实现聊天图文混排

Unity实战之一个脚本实现雷达图

公众号后台回复「资料」获取超多学习福利

>>点击进入技术讨论群 <<<" data-itemshowtype="0" tab="innerlink" data-linktype="2">>>>点击进入技术讨论群 <<<

▽加个好友一起进步吧!

长按/扫码关注我吧↑↑↑

觉得不错就点个在看吧!

关键词:

相关资讯
热门频道