手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板

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/

下面正式开始。

创建工程

使用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

只不过,还是个单机版,我们加上实时在线功能。

连接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

实时在线同步

向之前创建的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);
        }
    }
}

在线涂鸦画板就制作完成了,我们看看运行效果怎么样?

运行效果

构建以后,同时启动两个客户端,效果如下:

万猫学社

当然,这只是简单的在线涂鸦画板,你还可以再此基础上添加更丰富的功能,比如:修改画笔颜色、修改画笔大小等等。

最后,谢谢你这么帅,还给我点赞关注

Paint in 3D 绘制所有物体 - 在游戏内和编辑器里都可使用。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每个功能。然后你还可以看看如何将多个功能结合在一起的演示场景,创建一些更有趣的东西。 长期支持 - Paint in 3D 经过超过 5 年的定期更新,现在已经具有大量功能。感谢至今一直支持我们开发的所有人! 所有渲染管线 - 此资源支持标准管线,以及 LWRP、HDRP 和 URP。请参阅文档了解如何在它们之间切换。 随地可用 - Painy in 3D 一开始就被设计来用于尽多的设备和平台。它在桌面、移动端、VR 上等各个平台上都表现优秀!假如遇上任何性能问题,你可以调整许多设置来提升性能,而且其视觉效果影响极小。 包含了完整源代码 - 如果你是程序员,随时可以根据爱好代码进行调整,它可轻松地被修改。 光速绘制 - 通过使用GPU 加速,你的物体将以难以置信的速度被绘制。代码还经过深度优化来防止 GC 分配,和将所有绘制操作一起批次完成。 在游戏内和编辑器中绘制 - Paint in 3D 是被设计来既可以用于游戏内,也可用于编辑器中,以便你想创建自己的纹理。如果你是程序员的话,你还可以直接从 C#使用它。 稳定的性能 - 跟贴图系统不同,Paint in 3D一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 自动保存和加载 - Paint in 3D 一个简易使用的系统,可自动恢复你的绘制进度。如果你需要更高级的控制的话,你可以使用简单的 C# API 来手动控制。 蒙皮网格绘制 – Paint in 3D 让你能够以高性能绘制动态物体。查看 WebGL 演示,了解僵尸喷涂的极佳效果和绘制过程的方便快速。 画笔修改器 - 为你的画笔添加修改器,让它们变得活跃起来。它们可随机改变位置、旋转、不透明度、纹理,以及更多! 无缝 UV 绘制 - 正在用复杂的 UV 来绘制复杂的网格?没问题,Paint in 3D 能流畅无缝地在 UV 缝合上进行绘制,即使它们在不同的物体上,或甚至它们的缩放度不同! 撤消和重做系统 - Paint in 3D 中包括了完整的撤销 + 重做支持来为游戏内和编辑器内的绘制。在游戏内,绘制可以设置为使用全纹理快照来达到快速切换,也可以绘制动作重放来降低内存使用。撤消和重做能分别在全局、或在个别物体上进行,还可以用 UI 按钮或 C# AAPI 触发。 绘制遮罩 - 使用任何自定义纹理形状来轻松地将 3D 绘制遮罩添加到场景中。这将会自动防止所有新增的绘制在指定区域中出现,为你来了油印效果。 智能镜像系统 - Paint in 3D强大的镜像功能,让你同时绘制物体的两面。如果你用文字来绘制贴图的话 ,它们通常会倒后出现,Paint in 3D 能更正它! 绘制任何着色器 - Paint in 3D 让你绘制各种着色器和材质,包括你的自定义。只需直接选择你想绘制的纹理和你想使用的混合模式,然后你就能开始了! 多纹理绘制 - PBR 材料往往需要你同时绘制反照率 + 金属性 + AO 地图。这在 Paint in 3D 里很容易设置,甚至还可以将其自定义为任何其他类型的复杂材质。 颜色计数 – Paint in 3D简易使用的系统来计算某个指定的颜色占了多少像素。这在团队合作绘制游戏时非常合适,能让你看到谁绘制的最多。 LOD 绘制 - 假如你需要绘制高多边形网格的话,你可以通过应用低多边形网格绘制来加速过程,并且仍然使用高多边形网格来可视化绘制! VR支持 - 所有功能都在VR中都很好用,而且 Paint in 3D 还附了几个专为利用这些来设计的演示场景。如果你没有 VR 头盔的话, 不用担心,这些演示场景也可以与鼠标一起使用! 贴图绘制 - 使用此绘制工具来用你喜欢的纹理在物体表面上绘制。你能全面调控颜色、角度,甚至还有背面绘制和角度限制等这些高级设置。非常适合于汽车贴图、血溅 ,和更多! 实时绘制 - 应用了之后还需要移动贴图和其他绘制吗?实时绘制功能让你可以轻松地将绘制附加到任何变换中,给予你全面控制。 动态绘制 - 轻松地绘制动态贴图,就跟文字一样。此绘制模式兼容你在 UI 或相机中绘制的东西,包括复杂的纹理、角色、3D 物体等。 粒子碰撞绘制 - 使用此功能来用粒子绘制物体。这能让你做出逼真的喷漆涂鸦、烟熏等等! 物理碰撞绘制 - 留下绘制并将你的碰撞影响到下一个关卡中。这非常适用于添加凹痕、抓痕、 血溅,等等! 球形绘制 - 使用此 绘制工具来绘制球体半径中的每个像素。
Paint in 3D 绘制所有物体 - 在游戏内和编辑器里。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! ? 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每个功能。然后你还可以看看如何将多个功能结合在一起的演示场景,创建一些更有趣的东西。 ? 长期支持 - Paint in 3D 经过超过 5 年的定期更新,现在已经具有大量功能。感谢迄今为止一直支持其开发的每一个人! ? 所有渲染管线 - 此资源支持标准管线,以及 LWRP、HDRP 和 URP。请参阅文档了解如何在它们之间切换。 ? 随地可用 - Painy in 3D 一开始就被设计来用于尽多的设备和平台。它在台式、移动端、VR 上等更多都运行得很好!假如遇上任何性能问题,你可以调整许多设置来提升性能,而且其视觉效果影响极小。 ? 包含了完整源代码 - 如果你是程序员,随时可以根据爱好代码进行调整,它可轻松地被修改。 ? 光速绘制 - 通过使用GPU 加速,你的物体将以难以置信的速度被绘制。代码还经过深度优化来防止 GC 分配,和将所有绘制操作一起批次完成。 ? 在游戏内和编辑器中绘制 - Paint in 3D 是被设计来既可以用于游戏内,也可用于编辑器中,以便你想创建自己的纹理。如果你是程序员的话,你还可以直接从 C#使用它。 ? 稳定的性能 - 跟贴图系统不同,Paint in 3D一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 ?自动保存和加载 - Paint in 3D 一个简易使用的系统,可自动恢复你的绘制进度。如果你需要更高级的控制的话,你可以使用简单的 C# API 来手动控制。 ?蒙皮网格绘制 – Paint in 3D 让你能够以高性能绘制动态物体。查看 WebGL 演示,了解到僵尸绘制是多好看和绘制是如何一瞬间完成。 ?画笔修改器 - 为你的画笔添加修改器,让它们变得活跃起来。它们可随机改变位置、旋转、不透明度、纹理,以及更多! ? 无缝UV 绘制 - 正在用复杂的 UV 来绘制复杂的网格?没问题,Paint in 3D 能流畅无缝地在 UV 缝合上进行绘制,即使它们在不同的物体上,或甚至它们的缩放度不同! ? 撤消和重做系统 - Paint in 3D 中包括了完整的撤销 + 重做支持来为游戏内和编辑器内的绘制。在游戏内,绘制可以设置为使用全纹理快照来达到快速切换,也可以绘制动作重放来降低内存使用。撤消和重做能分别在全局、或在个别物体上进行,还可以用 UI 按钮或 C# AAPI 触发。 ? 绘制遮罩 - 使用任何自定义纹理形状来轻松地将 3D 绘制遮罩添加到场景中。这将会自动防止所有新增的绘制在指定区域中出现,为你来了油印效果。 ? 智能镜像系统 - Paint in 3D强大的镜像功能,让你同时绘制物体的两面。如果你用文字来绘制贴图的话 ,它们通常会倒后出现,Paint in 3D 能更正它! ? 绘制任何着色器 - Paint in 3D 让你绘制各种着色器和材质,包括你的自定义。只需直接选择你想绘制的纹理和你想使用的混合模式,然后你就能开始了! ? 多纹理绘制 - PBR 材料往往需要你同时绘制反照率 + 金属性 + AO 地图。这在 Paint in 3D 里很容易设置,甚至还可以将其自定义为任何其他类型的复杂材质。 ? 颜色计数 – Paint in 3D简易使用的系统来计算某个指定的颜色占了多少像素。这在团队合作绘制游戏时非常合适,能让你看到谁绘制的最多。 ?LOD 绘制 - 假如你需要绘制高多边形网格的话,你可以通过应用低多边形网格绘制来加速过程,并且仍然使用高多边形网格来可视化绘制! ? VR支持 - 所有功能都在VR中都很好用,而且 Paint in 3D 还附了几个专为利用这些来设计的演示场景。如果你没有 VR 头盔的话, 不用担心,这些演示场景也可以与鼠标一起使用! ? 贴图绘制 - 使用此绘制工具来用你喜欢的纹理在物体表面上绘制。你能全面调控颜色、角度,甚至还有背面绘制和角度限制等这些高级设置。非常适合于汽车贴图、血溅 ,和更多! ? 实时绘制 - 应用了之后还需要移动贴图和其他绘制吗?实时绘制功能让你可以轻松地将绘制附加到任何变换中,给予你全面控制。 ? 动态绘制 - 轻松地绘制动态贴图,就跟文字一样。此绘制模式兼容你在 UI 或相机中绘制的东西,包括复杂的纹理、角色、3D 物体等。 ? 粒子碰撞绘制 - 使用此功能来用粒子绘制物体。这能让你做出逼真的喷漆涂鸦、烟熏等等! ?物理碰撞绘制 - 留下绘制并将你的碰撞影响到下一个关卡中。这非常适用于添加凹痕、抓痕、 血溅,等等! ? 球形绘制 - 使用此 绘制工具来绘制球体半径中的每个像素。 ? 三边平面绘制 - 使用此绘制工具在复杂几何体上绘制无缝纹理。这能与球形和贴图绘制一起使用。 ? 孔形绘制 - 使用减性混合模式在物体上绘制孔。这能与球形和贴图绘制一起使用。 ? 法线绘制 - 使用法线混合模式绘制法线贴图。这可以让你将凹痕、抓痕 和其他细节添加到物体中。 ? 模糊绘制 - 使用模糊混合模式来将纹理中的像素模糊化。这可以让你将法线贴图平滑化 、抹去尖锐的线条等等! ? 间介绘制 - 使用此混合模式在 2 个 3D 点之间绘制第一个表面。这非常适合激光光束特效,还有更多! ? 贯通绘制 - 使用此混合模式在两个 3D 点之间绘制所有像素。这适合于非常强烈的激光光束特效,来贯穿一切。 ? 渐变绘制 - 使用此工具的任何混合模式,渐变绘制你的纹理中的所有像素。这非常适合随着时间逐渐淡化的特效,例如能量盾、雪中的足迹,以及更多! ? 泼溅贴图绘制 - 此绘制工具可让你用泼溅贴图将瓷片纹理绘制在物体上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万猫学社

您的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值