getLocation 與 getUILocation
傻傻分不清,只好自己去看清!
游戲開發(fā)中少不了觸摸操作,在 Cocos Creator 3.x 中觸摸事件中有 getLocation 和 getUILocation 這兩個方法,剛開始看到會有些困惑,所以就簡單整理一下其中的奧妙。
getLocation getUILocation白玉無冰決定在 Creator 3.4 探討 EventTouch 中的 getLocation 與 getUILocation 的區(qū)別。
先看一眼聲明文件,好像不是很明白。
聲明文件中的注釋再搜一搜官方文檔,看來關(guān)鍵點是在 UI窗口。
官方文檔再翻源碼瞧瞧,看看這兩口子有什么區(qū)別!
touch.ts 源碼盲生發(fā)現(xiàn)華點了!區(qū)別在 view._convertToUISpace,繼續(xù)前進看看!
_convertToUISpace看來 getUILocation 獲得的坐標(biāo)是 getLocation 的基礎(chǔ)上偏移一個位置,再放大一個系數(shù)。
接著再跟進 viewportRect 和 scale 是如何變化的。
setDesignResolutionSizeviewportRect 和 scale 是在設(shè)置設(shè)計分辨率和匹配模式來進行游戲畫面的屏幕適配時變化的。
原來 getUILocation 是設(shè)計分辨率與匹配模式相關(guān)的!
既然涉及到匹配模式,這里把所有匹配策略的代碼摳出來。
scale 就是根據(jù)這些適配策略的算出來的,詳細的說明就不細細展開了,可以參考代碼或者官方文檔。https://docs.cocos.com/creator/manual/zh/ui-system/components/engine/multi-resolution.html
官方文檔-多分辨率適配方案而 viewportRect ?是根據(jù)不同策略的容器大小關(guān)系算出的。
_buildResult接下來驗證一下吧!隨便寫一個測試代碼。
import?{?_decorator,?Component,?Node,?Label,?input,?Input,?EventTouch,?view,?screen?}?from?'cc';
const?{?ccclass,?property?}?=?_decorator;
@ccclass('NewComponent')
export?class?NewComponent?extends?Component?{
????@property(Label)
????lb:?Label?=?null!;
????@property(Node)
????click:?Node?=?null!;
????start()?{
????????input.on(Input.EventType.TOUCH_START,?this.onTouch,?this);
????????input.on(Input.EventType.TOUCH_MOVE,?this.onTouch,?this);
????}
????onTouch(evt:?EventTouch)?{
????????const?UILocation?=?evt.getUILocation();
????????this.lb.string?=
`
getLocation:${evt.getLocation().toString()}
getUILocation:${UILocation.toString()}
getLocationInView:${evt.getLocationInView().toString()}
view?scale:(${view.getScaleX().toFixed(3)},${view.getScaleY().toFixed(3)})
ViewportRect:${view.getViewportRect()}
DesignResolutionSize:${view.getDesignResolutionSize().toString()}
screen.windowSize:${screen.windowSize.toString()}
ResolutionPolicy:${view.getResolutionPolicy()._contentStrategy.name}
`;
????????this.click.setWorldPosition(UILocation.x,?UILocation.y,?0);
????}
}
根據(jù)代碼推論,當(dāng)設(shè)計分辨率與屏幕分辨率一致時,getLocation 和 getUILocation 得到結(jié)果是相同的。

分辨率一致
當(dāng)分辨率不一致時,根據(jù)適配策略會有些許不同:
ExactFit有不同縮放系數(shù)scaleX,scaleYShowAll有位置偏移和相同的縮放系數(shù)。NoBorder有位置偏移和相同的縮放系數(shù)。FixedHeight有相同的縮放系數(shù)。FixedWidth有相同的縮放系數(shù)。
那么為何有時需要位置偏移呢?關(guān)于這一點,白玉無冰沒有悟出來。等一個有緣人來化解這個坎。
為何 contentH 有不同的處理最后,結(jié)合放空老師的一文搞懂 Cocos Creator 3.0 坐標(biāo)轉(zhuǎn)換原理可以得出結(jié)論:
- 設(shè)計分辨率、實際分辨率以及適配策略決定了
getUILocation與getLocation的變化函數(shù)關(guān)系。 getUILocation可以用來直接設(shè)置 UI 元素的世界坐標(biāo)getLocation用于射線檢測等坐標(biāo)轉(zhuǎn)換。
本次探索之旅已結(jié)束,以上是白玉無冰根據(jù) Cocos Creator 3.4 源碼對getLocation 和 getUILocation 的分析。
快過年了,祝大伙萬事如意!隨手畫了一個微信紅包皮!送給大伙!

更多精彩歡迎關(guān)注微信公眾號
