[Unity Script] 偵測滑鼠是否碰觸遊戲畫面邊緣 Detect If Mouse on Edge of Screen

[Unity Script] 偵測滑鼠是否碰觸遊戲畫面邊緣 Detect If Mouse on Edge of Screen

此腳本是使用傳統 Input Manager 實作,可以取得滑鼠於螢幕邊緣的狀態,可回傳上、下、左、右、上左、上右、下左與下右,如果滑鼠於非邊緣而在畫面中則回傳未知狀態 (Unknown)。

The script was created with legacy Input Manager. It can simply get your mouse state when it is on edge of the screen. The “GetMouseEdgeState” method can return Top, Down, Left, Right, Top Left, Top Right, Down Left, and Down Right state. It also returns an unknown state when the mouse is over the game window.

public enum MouseEdgeState
{
    Unknown,
    Left, Right, Top, Down,
    TopLeft, TopRight,
    DownLeft, DownRight
}
private MouseEdgeState GetMouseEdgeState()
{
    var mouseX = Mathf.RoundToInt(Input.mousePosition.x);
    var mouseY = Mathf.RoundToInt(Input.mousePosition.y);
    if (mouseX >= Screen.width)
    {
        if (mouseY >= Screen.height)
        {
            return MouseEdgeState.TopRight;
        }
        else if (mouseY <= 0)
        {
            return MouseEdgeState.DownRight;
        }
        else
        {
            return MouseEdgeState.Right;
        }
    }
    else if (mouseX <= 0)
    {
        if (mouseY >= Screen.height)
        {
            return MouseEdgeState.TopLeft;
        }
        else if (mouseY <= 0)
        {
            return MouseEdgeState.DownLeft;
        }
        else
        {
            return MouseEdgeState.Left;
        }
    }
    else
    {
        if (mouseY >= Screen.height)
        {
            return MouseEdgeState.Top;
        }
        else if (mouseY <= 0)
        {
            return MouseEdgeState.Down;
        }
        else
        {
            return MouseEdgeState.Unknown;
        }
    }
}

Minecraft 多 OpenJDK 版本伺服器管理與啟動教學

Minecraft 在更新到 1.18 版本後,對於 Java — 也就是我們所說的 OpenJDK 版本要求終於提升到了 Java 17,無論是 模組還是插件伺服器皆是如此。

一般玩家可能無感,但如果你有同時架設多版本的伺服器,或者本身電腦有在進行 Java 類的開發工作,系統環境變數早已設定為固定版本,當你直接在 Minecraft 伺服器中下 java -jar server.jar 指令時,系統所調用的 JDK 程式可能不會是你所預想的版本。所以這篇文章我要來教你「如何管理與啟動多 JDK 版本的 Minecraft 伺服器」。

安裝 OpenJDK

如果你要架設的 Minecraft 伺服器是 1.18 以前的版本,我推薦使用 Adoptium 釋出的包,1.18 以後的版本則推薦用微軟維護的分支版本,效能理應比較好。

為方便待會進行不同版本的檔案管理,下載時請務必選擇 .zip 或其他的壓縮檔,我們要手動安裝,不要用 .exe 或 .msi 的來安裝,他會多做了一些不必要的設定 (我們沒有要設定環境變數)。

接下來選一個位置,新增一個 DK Files 資料夾來放置各版本的 OpenJDK,如果你有在開發軟體,可以在 DK Files 中再建立一個 OpenJDK 資料夾來區分各語言的 SDK 檔案。

最後將下載的 OpenJDK 分別解壓縮到資料夾內,資料夾名稱使用他的版本代號來區別。這邊舉例:17.0.2+8 是微軟提供的 17 版,jdk8u332-b09 是 Adoptium 的 8 版。

修改 Minecraft 啟動腳本

這邊我就假設你已經架設好 Minecraft 伺服器,但因為 OpenJDK 版本不同而無法執行。

首先我們用文字編輯器開啟伺服器的啟動腳本,在這裡我使用的是 start.bat。

接下來我們進入剛才整理好且對應版本的 OpenJDK 位置中的 bin 資料夾,先按著鍵盤 Shift 不要放,再對著 java.exe 檔案滑鼠右鍵,選擇 複製路徑

回到文字編輯器,將複製到的 java.exe 路徑直接取代 java -jar 指令的第一個 java 單字,如下圖。

執行啟動腳本後 Minecraft 伺服器將能使用正確的 Java 版本來執行。


用這樣的方法來管理不同版本的 OpenJDK 與 Minecraft 伺服器有個好處,因為不用動到系統的環境變數關係,我們就可以用幾個資料夾方便的進行版本控管,也不需要將電腦重新開機。


影片教學

OBS 內建 MKV、FLV 轉檔至 MP4 功能,快速完成錄影檔輸出作業

在 OBS 的錄影輸出設定當中,標示著如果你直接錄影為 MP4 與 MOV 檔案,當發生當機斷電等意外時檔案將毀損,也無法修復。為確保先前的內容不被完全破壞,官方建議使用者將錄影格式設定為 MKV (支援多音軌) 或 FLV。

雖然現在大多的影片播放器都可以支援 MKV,但是當你要上傳影片至例如 Discord 等平台時,MKV 沒辦法直接在軟體內播放,必須使用 MP4 格式來上傳。

然而,OBS 其實早已內建影片格式轉檔功能,支援將 MKV、FLV、FLV、TS 格式轉換為相容性最高的 MP4 檔,甚至可以設定自動轉檔,就不需要額外安裝專用的軟體來進行格式轉換工作。

關於為何不直接使用 MP4 進行錄影的詳細的技術說明可以參考:Should you be recording to MP4 with OBS? — OBS Mythbusters | by Jessica Alouette | Medium

錄影格式設定

在錄影之前,建議先確認輸出格式為 MKV 或 FLV,MKV 可以有效的支援多音軌,推薦使用。

影片格式轉檔步驟

一、確定結束錄影後,從頂部選單的 檔案 (F) > 重新封裝錄影 (M) 來開啟轉檔器。

二、點擊 OBS 錄影 這欄中的 … 按鈕選擇 MKV 檔或貼上原影片的路徑。

三、點擊 重新封裝 後即可在目標檔案的資料夾中找到完成輸出的 MP4 影片。

四、如果不想要每次錄影後都要手動轉檔,也可以在 設定 > 進階 > 錄影 中勾選 自動 remux 到 mp4 選項,這樣在停止錄影時 OBS 就會自動開始進行轉檔。缺點就是每次錄錯就要刪兩個檔案,或原檔案非常大時必須花時間等他真正的結束。


會注意到這點主要是我的 Bandicam 最近不曉得為何錄影時都會高機率出錯,導致輸出的 MP4 檔案都一直毀損。現在改用 OBS 進行錄影後就可以從較安全的 MKV 到 MP4 一條龍完成輸出作業,方便很多。

Windows 內建造詞工具可解決微軟注音輸入法自動選字錯誤問題

Windows 內建的注音輸入法最令我頭痛的是他總是學不會我常打的詞語,例如偵錯桐人四個字老是變成偵錯同仁。以前有嘗試過改用無蝦米或自然輸入法,但是當習慣第三方輸入法後,一到學校或公司的電腦上就會變成打字白痴,變得非常不順手。

最近很無聊的在亂搞系統時才發現,原來微軟注音輸入法已經有內建使用者造詞功能,雖然還是沒辦法做到自動學習,但至少已經能讓我自行輸入常用的單詞,提高撰寫文件報告的效率,也避免掉因為不同輸入法造成的操作問題。

微軟注音造詞工具開啟位置

Windows 10

滑鼠右鍵注音輸入法左側的中 / 英模式切換圖示,選擇 使用者造詞

Windows 11

滑鼠右鍵注音輸入法左側的中 / 英模式切換圖示,選擇 使用者片語

微軟注音造詞工具使用步驟

手動加入詞彙

一、雙點擊最新一列的空白區域。

二、手動於詞彙欄位中輸入文字後按下儲存。

三、完成後點擊 檔案 (F) / 儲存 (S) 或按下鍵盤 Ctrl + S 進行存檔。

從常用新詞中加入

另一種方法是從系統自動偵測的新詞中來加入,點擊左下方的 Tab 來切換。你可以觀察到系統自動新增的詞都大多都七零八落的,難怪怎麼學都學不好。

我們在列表中找到你覺得可以加入的詞後,在列上滑鼠右鍵 > 移動至使用者造詞 (M)。

切換 Tab 回到使用者造詞,我們剛才選取的詞彙就已經被轉移過來了。

最後一樣要完成存檔後才會生效。


有找到這個功能真的是解決了多年來的問題,每次在寫文件的時候不是「點擊」變成「點及」,不然就是「幀數」寫成「正數」,導致「每一次」都要多花那一兩秒選字真的很煩人,怨念滿滿。

總算能脫離這個錯字地獄了,如果有幫助到你的話也麻煩把這篇文章分享出去!

Steam 變更與管理遊戲收藏庫安裝位置教學

Steam 預設會將遊戲安裝在本機磁碟 (C:) ,與作業系統共用磁碟。乍看至下貌似沒甚麼問題,但如果未來電腦發生了更新災情或中毒等極需重灌作業系統的狀況,因為系統碟會洗白,將導致先前下載的遊戲會全部消失,而後還要浪費許多時間在重新下載。

所以理想的做法是將作業系統與存放遊戲與其他資料的位置分開,這裡不說明磁碟分割,我們直接來看能管理遊戲收藏庫安裝位置要如何設定。

開啟 Steam 空間管理器

一、首先啟動你的 Steam 程式,點擊左上角的 Steam 後進入 設定

二、切換到 下載 分頁,點擊收藏庫管理群組中的 Steam 收藏庫資料夾 以開啟空間管理器。

新增遊戲收藏庫空間

一、點擊上方現有空間旁的 + 新增一個 Steam 收藏庫資料夾,下拉式選單中會儲存前一次的設定,如果要變更請把他改成 我想選擇別的位置

二、建立或選擇你想放置遊戲檔案的位置即完成收藏庫資料夾的建立。另外如果你選擇的位置是以前有使用過的收藏庫資料夾,Steam 會自動將目錄內的遊戲導入。

三、展開右邊的選項可將此空間設為預設值,下次在安裝遊戲時就會自動套用設定。

移除收藏庫空間

一、如果空間設定錯了要更改,一樣展開右側的選項並點擊移除磁碟。這個移除僅會讓遊戲從 Steam 已安裝的遊戲中移除,只要重新將空間加回來就會恢復。

二、移除設定錯誤的收藏庫資料夾後,記得要去將不要的資料夾刪除,節省空間。

解決 Windows 10/11 於 AMD Ryzen CPU 發生不定期聲音及影像卡頓問題

我們先來參考這篇報導 Win10/11下 Ryzen 處理器出現卡頓、當機 bug AMD 確認 5 月發新 BIOS | XFastest News,此報導的重點是 AMD CPU 在開啟 fTPM 的情況下會導致 Windows 系統不定期發生持續約一秒畫面掉幀、聲音卡頓的怪現象。與以下影片中發生的卡頓狀況相同:

不是你的電腦在卡,是拍這影片的電腦是卡的。

在那篇報導當中,AMD 也表示已找到問題根源,預計在這個月 (2022 年 5 月) 發布新版 BIOS。在這裡我們有兩個選擇,一是等待新版 BIOS 的釋出,二是直接關閉 fTPM 功能。


在正式關閉 fTPM 前你必須先了解幾件事情:

  1. 開關 fTPM 功能將導致電腦遺失你原先設置的登入 PIN,完成本篇的操作後 Windows 將會要求你透過 Microsoft 帳戶來重新設置 PIN 碼,所以請務必確保網路連線是正常的。
  2. 如果你的電腦現在為 Windows 11 作業系統,關閉 fTPM 功能可能將導致某些軟體或遊戲無法執行。

理解後就讓我們開始進行這篇的主題。


操作步驟

一、將電腦重新開機,並在開機過程中點擊鍵盤 Delete 讓系統進入 BIOS。如果掌握不到時機的話也可以在開機時瘋狂連點 Delete,這樣搞電腦它不會壞,放心。

二、接下來進入 BIOS 的進階設定中,切換到 Settings/Miscellaneous 層級。我是使用 X570 AORUS ELITE WIFI 這張主機板來進行操作,別的主機板的 BIOS 畫面可能會不太一樣,功能的位置需要翻找一下。

三、將 AMD CPU fTPM 選項關閉。

四、最後點擊 F10 儲存設定後重新啟動 Windows,並重新設定 PIN,電腦不會卡了,完成。

Unity 骨架控制器「Animation Rigging」手部骨架基礎操作

想要在 Unity 裡控制 3D 模型的骨架,除了最知名的「Final IK」付費套件可以用外,如果你的 Unity 引擎版本在 2020 版以上,也可以來嘗試看看官方支援的「Animation Rigging」。

在這篇內容中我僅能介紹基礎的用法,因為我對於 3D 模型相關的知識目前處於入門等級,尚在學習中。


前情提要

  • 模型必須先綁好骨架並蒙皮。
  • 建議先在主流 3D 建模軟體中完成動畫設計,再由 Animation Rigging 進行動態控制。

套件資訊


套件安裝

Animation Rigging 已經是正式版套件,可以直接透過 Package Manager 進行安裝。


模型配置

一、匯入模型,我在 Mixamo 中找了一個動畫附帶模型作為操作範例,此模型已帶有骨架與動畫。

二、將模型拉入場景,為物件新增 Animator 組件和 Animator Controller,並將模型自帶的動畫拉入控制器中並設為預設。

三、顯示骨架,先選中場景上的人物模型,從頂部選單執行 Bone Renderer Setup。

四、模型將會被新增一個 Bone Renderer 組件以渲染人物骨架,可透過調整 Bone Size 與 Color 來使骨架清楚顯示。


建立手部控制器

一、先選中人物模型,只不過這次要執行的是 Rig Setup,這將會新增 Rig Builder 組件與一個子物件 Rig1。

二、在 Rig1 下建立一個空物件,先給他新增一個「Two Bone IK Constraint」,再將模型骨架中的手部物件拖入 Tip 欄位,最後在組件的標題上滑鼠右鍵選單執行 Auto Setup from Tip Transform,其他的組件欄位將會自動設置完畢,也會多出 target 和 hint 兩個子物件。

三、這邊產生的 LeftHand_target 物件就是我們的手部骨架控制器,但現在他的座標還是在 (0, 0, 0),需要進行對齊。請按著鍵盤 Ctrl,先選 LeftHand_target 後再選手部骨架,再透過頂部選單進行 Align Transform 對齊。

四、現在的 LeftHand_target 已經與手部骨架對齊,接下來選中他,並點選場景中 Animation Rigging 浮動視窗中的 + 按鈕以建立可視的控制器。

五、可調整 Shape、Size、Rotation 等屬性以使控制器符合模型現況。

六、接下來讓 LeftHand_hint 也做一樣的對齊、加 Effector 動作,但是這個物件放置的座標要注意一下,因為人的手肘是往後彎曲的,要將他放在手的後面。

LeftHand_hint 是拿來讓 Unity 判斷控制器移動時骨架要彎曲的方向,這個物件是可選的,當然我們也可刪掉 LeftHand_hint,讓 Unity 自行判斷。

LeftHand_hint 物件位置對於彎曲行為的影響:

https://tedliou.com/wp-content/uploads/2022/03/2022-03-25-23-58-11-1.mp4

完成。

https://tedliou.com/wp-content/uploads/2022/03/2022-03-26-00-00-30-1.mp4

Unity 假彈道製作「二次方貝茲曲線」原理與語法

想要在 Unity 中讓物體進行拋物線運動,平常的我可能會直接用 Rigidbody 來施加力,讓系統自己去運算物理的大小事。但有時候我只是要做個「看起來」是拋物線運動的效果,沒有必要弄到非常真實,就可以套個曲線公式來施作。

原理

我們最常看到的貝茲曲線是只有一個原點、一個終點與一個控制點的「二次方貝茲曲線」,你可以透過移動控制點來修改曲線。在推導「二次方貝茲曲線」前,必須先了解「線性貝茲曲線」,它等同於我們常用的線性插值。

線性貝茲曲線

線性貝茲曲線等同線性差值,我們現在已知 A 與 B 的座標位置,也假定總共移動所需的時間 t 為 1,t 介於 0~1,可以直接想像成此次移動的完成百分比 (0~100%)。

t 代表時間,A 和 B 分別代表原點與終點,C 就是結果。

先以簡單的一維空間來解釋…

假設 A = 0、B = 10,求 t = 0.2 時 C 點的位置。這時就可以用 A~B 的距離乘 t 來表示 C 的位置:

但是這個假設是建立在原點 = 0 的情況,所以正確的式子是:

用分配律整理一下,這就是「線性貝茲曲線」的公式:

接下來帶入剛才假設的數值,得 C = 2:

二次方貝茲曲線

進入主題,二次方貝茲曲線是由三條線性貝茲曲線組合出來的產物,以下方影片為例,我們將使用到

  1. 先定義由左到右的座標分別為 A、B、C 點。
  2. 分別計算 A~B 與 B~C 上的點於指定 t 的時候所在的座標,可得出的 D、E 兩個座標點。
  3. 將 D 與 E 帶入公式最後得出我們要的 F 座標:

https://tedliou.com/wp-content/uploads/2022/03/movie_002.mp4

能用三個線性貝茲曲線算出座標後,是時候將他整理成一個公式…

首先是剛才計算 AB、 BC 線段上的 D、E 座標式子:

還有最終的 F 座標式子:

將 D 和 E 帶入 F 座標的式子:

整理後可得以下公式,t 介於 0~1 之間:


二次方貝茲曲線公式


語法

Unity 中的次方可使用 Mathf.Pow 來實現,最後的 Bt 座標就是指定時間點 t 的貝茲曲線座標。

public Transform P0, P1, P2, Bt;

private void Start()
{
    var t = 0.5f;
    var p0 = P0.position;
    var p1 = P1.position;
    var p2 = P2.position;
    Bt.position = Mathf.Pow(1 - t, 2) * p0 + 2 * t * (1 - t) * p1 + Mathf.Pow(t, 2) * p2;
}

也可以放到 Update 中並給予時間與線段特效,以下影片為例:

https://tedliou.com/wp-content/uploads/2022/03/movie_003-1.mp4

完整腳本:

using UnityEngine;

public class BezierCalculator : MonoBehaviour
{
    public int Duration = 5;
    public Transform P0, P1, P2, Bt;

    private float _time;
    private float _duration;

    private void Update()
    {
        if (_duration > Duration)
        {
            _duration = 0;
        }

        var t = _duration / Duration;
        Bt.position =
            Mathf.Pow(1 - t, 2) * P0.position +
            2 * t * (1 - t) * P1.position +
            Mathf.Pow(t, 2) * P2.position;

        _duration += Time.deltaTime;
    }
}

Unity 以任意角度取圓周上座標之原理與語法

因為要在 Unity 上做一個能在圓周上隨機生成物件的功能,回去研究了一下關於圓與角度的數學。

原理

一、我們會先定義好圓心和半徑,這邊的圓心為 (0, 0)、C = 半徑、θ 為角度,可繪製出以下圖形:

(B, A) 就是我們要求的座標。

二、帶入三角函數公式,其實這就是邊的比例。


先取 座標,我們已知 C = 半徑,為了拿到 B 值,要用 C 乘

已知 等於 ,所以等同

去分母後就是 B 值。


座標同理,只不過改成 C 乘

一樣去分母…


語法

知道為什麼需要乘 後,接下來就是用腳本來實現他。

一、定義圓心與半徑。

var center = new Vector3(0, 0, 0);
var radius = 3;

二、計算弧度,因為 Unity 自帶的 Mathf.Cos 和 Mathf.Sin 只能輸入弧度並非角度,所以需要事先進行換算。( = 弧度、 = 角度)

以 20 度為例:

var rad = 20 * Mathf.PI / 180;

三、計算 XY 座標,如圓心不在 (0, 0) 時需要加上圓心座標。

var x = center.x + radius * Mathf.Cos(rad);
var y = center.y + radius * Mathf.Sin(rad);

四、最後加入物件生成後會像這樣,指定於角度 20 度座標位置生成一個 Ball 物件:

public GameObject Ball;

private void Start()
{
    var center = new Vector3(0, 0, 0);
    var radius = 3;
    var rad = 20 * Mathf.PI / 180;
    var x = center.x + radius * Mathf.Cos(rad);
    var y = center.y + radius * Mathf.Sin(rad);
    Ball.transform.position = new Vector3(x, y, center.z);
    Instantiate(Ball);
}

Unity 預覽,紅點為圓心,白點為生成的 Ball。

五、實際運用方面,我們可以用迴圈達成「在圓周上每 20 度生成一個物件」的目的。

public GameObject Ball;

private void Start()
{
    var center = new Vector3(0, 0, 0);
    var radius = 3;
    for (int i = 0; i < 360; i += 20)
    {
        var rad = i * Mathf.PI / 180;
        var x = center.x + radius * Mathf.Cos(rad);
        var y = center.y + radius * Mathf.Sin(rad);
        Ball.transform.position = new Vector3(x, y, center.z);
        Instantiate(Ball);
    }
}

輸出結果

Unity 圓周繞行運動「transform.RotateAround」語法說明

圓周繞行至少有兩種方式可以實現,一是利用 Unity 父子物件相對位置固定的特性,以旋轉父物件來達到目的,另一個就是本篇將提到的「transform.RotateAround」語法。

格式

transform.RotateAround(圓心座標, 繞行軸向, 角度);

如果我們指定物件要繞行的圓的圓心為 (0, 0, 0),且以 Z 為軸向旋轉,可以寫成這樣 (放在 Update 中):

transform.RotateAround(new Vector3(0, 0, 0), new Vector3(0, 0, 1), 360 * Time.deltaTime);

軸向也能給斜的,只不過在開發 2D 遊戲時不太會用到。

最後面表示角度的 360 * Time.deltaTime 是代表一秒轉一圈,我們可以額外乘上一個變數來控制速度。當這個角度參數為正時會逆時鐘旋轉,小於零時順時鐘。

transform.RotateAround(Vector3.zero, Vector3.forward, 360 * Time.deltaTime * Speed);

另外,因為 transform.RotateAround 會直接動到物件的旋轉角度,如果想要將它固定的話可以直接在下一行改回來。

transform.right = Vector3.right;

改回來後就不會再旋轉了。

結果

https://tedliou.com/wp-content/uploads/2022/03/2022-03-20-20-43-22.mp4

Unity 免 Build 多人連線測試套件「ParrelSync」安裝與使用

「ParrelSync」套件可快速達成 Unity 專案同步雙開的目的,以快速進行多人遊戲連線測試作業。


套件資訊


安裝與使用

一、從 套件 Github 中取得 Unitypackage 後直接開啟匯入。

二、從上方工具列開啟 Clones Manager (ParrelSync/Clones Manager)。

三、點擊 Create new clone 並等待專案複製完成。

四、點擊 Open in New Editor 啟動剛才複製的專案。

五、等待複製的專案啟動完成後,兩邊的專案內容將完全一致,且當你變更原專案的內容時,複製的專案將會自動完成同步,在多人遊戲開發中即可進行快速測試。

可以從 Clones Manager 中點擊 View Folder 來開啟複製的專案資料夾,你會發現其中 Assets 與 ProjectSettings 目錄是一個類似捷徑的東西。

舉例說明,當原專案場景變更時,滑鼠點開複製的專案時就會要求進行場景 Reload,重載後即完成同步。

另外 ParrelSync 有加入防呆機制,你不可以直接變更複製的專案的內容,在嘗試存檔時會自動阻擋,請一律在原專案中進行內容修改。

Minecraft 暗黑版 UI 模組「Dark Mode Everywhere」安裝與使用

「Dark Mode Everywhere」是一個能讓玩家切換 Minecraft UI 介面顏色明暗的模組,共有 Perfect Dark、Less Perfect Dark、Toasted Light 三階段樣式可選。


模組資訊


效果預覽


安裝與使用

一、這邊我選擇使用 CurseForge 客戶端 來安裝模組,這是目前比較快速輕鬆的方法。當你的電腦安裝好 CurseForge 後,用瀏覽器前往 Dark Mode Everywhere 模組頁面後點擊右上角橘色的 Install,系統將會自動開啟 CurseForge 開始安裝。

二、接下來會出現的「Where would you like to install your mod?」選項,如果你還沒有安裝任何模組或要建立新的模組包的話就選「Create a new profile」,如果已經有建立過模組包,只是要額外加入其他模組就選擇「Select a profile」。

三、如果是選擇「Create a new profile」就會到達建立設定檔的畫面,Curse Forge 會自動匹配所需的版本與模組載入器核心,為設定檔取個名字後點擊 Create。

四、等待一段時間,安裝完成後就啟動我們剛才建立的「Modded Game」。

五、進入遊戲後開個單人世界,按下 E 鍵開啟背包後即可看到介面上多出的 Dark Mode 按鈕,單點擊即可切換模式,按著 Shift 鍵並點擊按鈕的話可以直接切回原始的亮色模式。

Exit mobile version