前言
最近在优化项目,策划提了一个需求,需要实现一个通用点击特效。
尝试1
首先想到的是改变鼠标指针样式,这个以前学过,还有点印象,以前刚开始学unity的时候,记得看到过一个方法可以改变游戏中鼠标指针样式。方法如下:选择“Edit”——>“Project Setting”,打开项目设置
一顿操作后发现,这个只能将鼠标样式改为image,可现在美术给的是粒子特效,这可把我给难住了。
尝试2
突然想到,unity不是有监听鼠标点击的方法,监听到鼠标点击时,就可以实例化一个特效,播放完销毁。思路有了,做起来就简单了。1.首先需要实有个update方法能实时监测
function this.onclick()
UpdateBeat:Add(this.updata,this)
end
function this.updata()
end
2.接着需要实现监测是否有鼠标点击
local Input = UnityEngine.Input
if Input.GetMouseButtonDown(0) then
end
3.检测到后需要计算出特效的位置
local x = (Input.mousePosition.x - Screen.width / 2) * resolutiManager:GetScreenSize().x / Screen.width
local y = (Input.mousePosition.y - Screen.height / 2) * resolutiManager:GetScreenSize().y / Screen.height
4.在指定的位置实例化特效
if not utils.findchild(prant,"UI_dianji(Clone)") then
local prant = GameObject.Find("UIRoot").transform
local OpEffect = 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
完成代码如下:
local Input = UnityEngine.Input
function this.onclick()
UpdateBeat:Add(this.updata,this)
end
function this.updata()
if Input.GetMouseButtonDown(0) then
local prant = GameObject.Find("UIRoot").transform
local x = (Input.mousePosition.x - Screen.width / 2) * resolutiManager:GetScreenSize().x / Screen.width
local y = (Input.mousePosition.y - Screen.height / 2) * resolutiManager:GetScreenSize().y / Screen.height
if not utils.findchild(prant,"UI_dianji(Clone)") then
local OpEffect = 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
end
end
在需要的地方调用onclick方法即可。
效果
优化
上面实例化和销毁太频繁了,考虑做成显示隐藏。start方法里获取特效物体
function view:start()
ui.clickEff = base:findobj("clickEff")
end
完整代码
local Input = UnityEngine.Input
function view:start()
ui.clickEff = base:findobj("clickEff")
end
function this.onclick()
UpdateBeat:Add(this.updata,this)
end
function this.updata()
if Input.GetMouseButtonDown(0) then
self.clickEff.gameObject:SetActive(false)
local x = (Input.mousePosition.x - Util.ScreenWidth() / 2) * ResolutiManager:GetScreenSize().x / Util.ScreenWidth()
local y = (Input.mousePosition.y - Util.ScreenHeight() / 2) * ResolutiManager:GetScreenSize().y / Util.ScreenHeight()
self.clickEff.parent.localPosition = Vector2(x, y)
self.clickEff.gameObject:SetActive(true)
end
end
福利
首先,感谢北京大学出版社 为 "爱上游戏开发" 提供的书籍赞助,非常感谢!后续公众号头条推文,也会有送书活动,大家记得看完文章后,多多参与送书哈,混脸熟也能中奖!
本书将以一款开放世界类游戏的实践过程为主线,为读者呈现从零开始上线一款游戏的实践路线、游戏引擎Unity的开发模式,以及游戏开发的核心框架。
👉参与方式:
添加小编微信,进技术交流群抢红包,运气王可免费获赠上述书籍一本,活动时间4月13日-16日,不定时发红包,快来积极参与吧!
tips:没加小编微信的先加一下小编微信,方便拉你进群参与抽奖及中奖之后安排发货哟~
-- END --
公众号后台回复「资料」获取超多学习福利
>>> 点击进入技术讨论群 <<< ▽加个好友一起进步吧!
长按/扫码关注我吧↑↑↑
觉得不错就点个在看吧!