首页 文章详情

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

爱上游戏开发 | 2 2023-08-09 05:23 0 0 0
UniSMS (合一短信)

前言

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

尝试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手机游戏开发:从搭建到发布上线全流程实战

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

👉参与方式:

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

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

-- END --


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

>>> 点击进入技术讨论群 <<<
▽加个好友一起进步吧!

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

觉得不错就点个在看


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter