手把手帶你使用Paint in 3D和Photon擼一個線上塗鴉畫板

来源:https://www.cnblogs.com/heihaozi/archive/2022/03/29/16072505.html
-Advertisement-
Play Games

Paint in 3D Paint in 3D用於在游戲內和編輯器里繪製所有物體。所有功能已經過深度優化,在WebGL、移動端、VR 以及更多平臺用起來都非常好用! 它支持標準管線,以及 LWRP、HDRP 和 URP。通過使用GPU 加速,你的物體將以難以置信的速度被繪製。代碼還經過深度優化來防止 ...


Paint in 3D

Paint in 3D用於在游戲內和編輯器里繪製所有物體。所有功能已經過深度優化,在WebGL、移動端、VR 以及更多平臺用起來都非常好用!

它支持標準管線,以及 LWRP、HDRP 和 URP。通過使用GPU 加速,你的物體將以難以置信的速度被繪製。代碼還經過深度優化來防止GC,和將所有繪製操作一起批次完成。

跟貼圖系統不同,它是一個紋理繪製解決方案。這意味著你可以繪製你的物體上百萬次,還是無幀率丟失,讓你創作難以想象的游戲。

它在Unity應用商店上的售價是60美元,地址:https://assetstore.unity.com/packages/tools/painting/paint-in-3d-26286

Photon

Photon中文翻譯為“光子”,為有著15年伺服器後端開發經驗的德國Exit Games公司開發的高效,穩定,可拓展的網路引擎。為目前世界上用戶最廣泛,支持游戲類型最多的專業網路引擎之一,也是Unity應用商店裡用戶評價最高的網路組件。

世界多個知名游戲公司和工作室選用Photon作為其產品的網路支持引擎,其中包括WB華納,Codemaster, 2K, Glu, 微軟游戲工作室,史克威爾艾尼克斯,百代南夢宮,SandBox,雨神電競等知名企業,也有許多工作室和新創企業正在瞭解和試用Photon之中。

它在Unity應用商店上有一個免費應用,地址:https://assetstore.unity.com/packages/tools/network/pun-2-free-119922

當然,Photon需要註冊賬號、創建應用等操作才能使用,還不瞭解的同學可以去官方網站查閱相關資料。

溫馨提示:Photon的國外伺服器在國內使用比較卡,所以最好去中國官網申請國內的伺服器,申請地址:https://vibrantlink.com/chinacloudapply/

下麵正式開始。

微信掃描二維碼關註後回覆「電子書」,獲取12本Java必讀技術書籍。

創建工程

使用Unity Hub創建一個3D項目,然後分別引入Paint in 3DPhoton Unity Networking 2,如下圖:

萬貓學社.png

溫馨提示:在引入Photon Unity Networking 2後,記得配置AppId。

創建簡易畫板

為了方便演示,我們創建一個Quad作為畫板,然後為其添加P3dPaintable、P3dMaterialCloner和P3dPaintableTexture組件,使用它們的預設配置即可,如下圖:

萬貓學社.png

然後,創建一個空的GameObject命名為OneMorePaint,然後向OneMorePaint添加P3dPaintSphere組件,修改P3dPaintSphere組件的Color為紅色,其他配置保持預設不變,如下圖:

萬貓學社.png

再向OneMorePaint添加P3dHitScreen組件,勾選上P3dHitScreen組件的ConnectHits,其他配置保持預設不變,如下圖:

萬貓學社.png

這時候,創建簡易畫板就做好了,運行以後就可以畫畫了,如下圖:

萬貓學社.png

只不過,還是個單機版,我們加上實時線上功能。

微信掃描二維碼關註後回覆「電子書」,獲取12本Java必讀技術書籍。

連接PUN2伺服器

創建一個C#腳本命名為Launcher,再創建一個空的GameObject命名為LauncherGameObject,把C#腳本Launcher添加到LauncherGameObject中。

編輯C#腳本Launcher為如下內容:

using Photon.Pun;
using Photon.Realtime;
using UnityEngine;

namespace One.More
{
    public class Launcher : MonoBehaviourPunCallbacks
    {
        #region Private Fields
        /// <summary>
        /// This client's version number. Users are separated from each other by gameVersion (which allows you to make breaking changes).
        /// </summary>
        string gameVersion = "1";
        /// <summary>
        /// Keep track of the current process. Since connection is asynchronous and is based on several callbacks from Photon,
        /// we need to keep track of this to properly adjust the behavior when we receive call back by Photon.
        /// Typically this is used for the OnConnectedToMaster() callback.
        /// </summary>
        bool isConnecting;
        #endregion

        void Start()
        {
            this.Connect();
        }

        #region MonoBehaviourPunCallbacks Callbacks
        public override void OnConnectedToMaster()
        {
            Debug.Log("PUN Basics Tutorial/Launcher: OnConnectedToMaster() was called by PUN");
            // we don't want to do anything if we are not attempting to join a room.
            // this case where isConnecting is false is typically when you lost or quit the game, when this level is loaded, OnConnectedToMaster will be called, in that case
            // we don't want to do anything.
            if (isConnecting)
            {
                // #Critical: The first we try to do is to join a potential existing room. If there is, good, else, we'll be called back with OnJoinRandomFailed()
                PhotonNetwork.JoinRandomRoom();
                isConnecting = false;
            }
        }
        public override void OnDisconnected(DisconnectCause cause)
        {
            Debug.LogWarningFormat("PUN Basics Tutorial/Launcher: OnDisconnected() was called by PUN with reason {0}", cause);
            isConnecting = false;
        }
        public override void OnJoinRandomFailed(short returnCode, string message)
        {
            Debug.Log("PUN Basics Tutorial/Launcher:OnJoinRandomFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom");
            // #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.
            PhotonNetwork.CreateRoom(null, new RoomOptions());
        }
        public override void OnJoinedRoom()
        {
            Debug.Log("PUN Basics Tutorial/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// Start the connection process.
        /// - If already connected, we attempt joining a random room
        /// - if not yet connected, Connect this application instance to Photon Cloud Network
        /// </summary>
        public void Connect()
        {
            // we check if we are connected or not, we join if we are , else we initiate the connection to the server.
            if (PhotonNetwork.IsConnected)
            {
                // #Critical we need at this point to attempt joining a Random Room. If it fails, we'll get notified in OnJoinRandomFailed() and we'll create one.
                PhotonNetwork.JoinRandomRoom();
            }
            else
            {
                // #Critical, we must first and foremost connect to Photon Online Server.
                isConnecting = PhotonNetwork.ConnectUsingSettings();
                PhotonNetwork.GameVersion = gameVersion;
            }
        }
        #endregion
    }
}

這時候,就可以連接到連接PUN2伺服器了,運行以後我們可以看到如下日誌:

萬貓學社.png

微信掃描二維碼關註後回覆「電子書」,獲取12本Java必讀技術書籍。

實時線上同步

向之前創建的OneMorePaint添加PhotonView組件,使用預設配置即可,如下圖:

萬貓學社.png

創建一個C#腳本命名為OnlinePainting,把C#腳本OnlinePainting添加到OneMorePaint中。

編輯C#腳本OnlinePainting為如下內容:

using PaintIn3D;
using Photon.Pun;
using UnityEngine;

namespace One.More
{
    public class OnlinePainting : MonoBehaviour, IHitPoint, IHitLine
    {
        private PhotonView photonView;
        private P3dPaintSphere paintSphere;

        void Start()
        {
            this.photonView = this.GetComponent<PhotonView>();
            this.paintSphere = this.GetComponent<P3dPaintSphere>();
        }

        public void HandleHitPoint(bool preview, int priority, float pressure, int seed, Vector3 position, Quaternion rotation)
        {
            if (preview)
            {
                return;
            }
            if (this.photonView == null)
            {
                Debug.LogError("PhotonView is not found.");
                return;
            }
            this.photonView.RPC("HandleHitPointRpc", RpcTarget.Others, preview, priority, pressure, seed, position, rotation);
        }

        public void HandleHitLine(bool preview, int priority, float pressure, int seed, Vector3 position, Vector3 endPosition, Quaternion rotation, bool clip)
        {
            if (preview)
            {
                return;
            }
            if (this.photonView == null)
            {
                Debug.LogError("PhotonView is not found.");
                return;
            }
            this.photonView.RPC("HandleHitLinetRpc", RpcTarget.Others, preview, priority, pressure, seed, position, endPosition, rotation, clip);
        }

        [PunRPC]
        public void HandleHitPointRpc(bool preview, int priority, float pressure, int seed, Vector3 position, Quaternion rotation)
        {
            if (this.paintSphere == null)
            {
                Debug.LogError("P3dPaintSphere is not found.");
                return;
            }
            this.paintSphere.HandleHitPoint(preview, priority, pressure, seed, position, rotation);
        }

        [PunRPC]
        public void HandleHitLinetRpc(bool preview, int priority, float pressure, int seed, Vector3 position, Vector3 endPosition, Quaternion rotation, bool clip)
        {
            if (this.paintSphere == null)
            {
                Debug.LogError("P3dPaintSphere is not found.");
                return;
            }
            this.paintSphere.HandleHitLine(preview, priority, pressure, seed, position, endPosition, rotation, clip);
        }
    }
}

線上塗鴉畫板就製作完成了,我們看看運行效果怎麼樣?

運行效果

構建以後,同時啟動兩個客戶端,效果如下:

萬貓學社

當然,這隻是簡單的線上塗鴉畫板,你還可以再此基礎上添加更豐富的功能,比如:修改畫筆顏色、修改畫筆大小等等。

微信掃描二維碼關註後回覆「電子書」,獲取12本Java必讀技術書籍。

最後,謝謝你這麼帥,還給我點贊關註

作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
版權聲明:本文遵循 CC 4.0 BY-NC-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
微信掃描二維碼,關註萬貓學社,回覆「電子書」,免費獲取12本Java必讀技術書籍。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 很多時候,我們項目在開發環境和生成環境的環境配置是不一樣的,例如,資料庫配置,在開發的時候,我們一般用測試資料庫,而在生產環境的時候,我們是用正式的數據,這時候,我們可以利用profile在不同的環境下配置用不同的配置文件或者不同的配置。 解決方案 spring boot允許你通過命名約定按照 ...
  • 程式的異常:Throwable * 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。 * 問題:Exception * A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。 * B:運行期問題:RuntimeExcep ...
  • 一、前言 掃描件一直受大眾青睞,任何紙質資料在掃描之後進行存檔,想使用時手機就能打開,省心省力。但是掃描件的優點也恰恰造成了它的一個缺點,因為是通過電子設備掃描,所以出來的是圖像,如果想要處理文件上的內容,直接操作是無法實現的。 那要是想要引用其中的內容怎麼辦呢?別擔心,Python幫你解決問題。 ...
  • 一、序言 Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢: 緩存品種多 支持緩存品種多,常見緩存Redis、EhCache、Caffeine均支持。它們之間既能獨立使用,也能組合使用。 平滑遷移 Spring內部支持的緩存,可實現無縫平滑遷移,無需修改 ...
  • 首先 相信有很多小伙伴都喜歡玩抖音吧,最近抖音張同學突然火了,兩個月漲粉一千多萬。看了他的視頻,滿滿的生活氣息,讓人有一種家的感覺。這就讓我很感興趣了,必須得用Python對他分析一下。 今天這篇文章,我抓取了張同學的視頻的評論數據,想從文本分析的角度,挖掘一下大家對張同學感興趣的點。 張同學 10 ...
  • 內容概要 web 開發模式 API 介面 postman 測試軟體的使用 restful 規範 drf 的安裝與使用 cbv 的 View 源碼分析 APIView 源碼分析 drf 的 Request 類 drf 的 APIView 類執行過程 內容詳細 web 開發模式 1、前後端不分離 在開發 ...
  • Nacos作為配置中心,必然需要保證服務節點的高可用性,那麼Nacos是如何實現集群的呢? 下麵這個圖,表示Nacos集群的部署圖。 Nacos集群工作原理 Nacos作為配置中心的集群結構中,是一種無中心化節點的設計,由於沒有主從節點,也沒有選舉機制,所以為了能夠實現熱備,就需要增加虛擬IP(VI ...
  • 一 概述 GEM標准定義了通信鏈路上的半導體設備的行為。 SECS-II標准定義了在主機和設備之間交換的消息和相關數據項。GEM標準則定義了在哪種情況下應該使用哪些SECS-II消息以及由此產生的結果行為。圖1.1說明瞭GEM、SECS-II和其他通信替代方案之間的關係。 GEM為所有半導體設備定義 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...