unity的PUN如何同步自定义脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity的PUN如何同步自定义脚本相关的知识,希望对你有一定的参考价值。

参考技术A 首先启动Unity,单机菜单栏中的AssetsCreate来添加脚本。
unity是一种用于多人游戏的Unity软件包。灵活的匹配可以让玩家进入房间,可以通过网络同步对象。快速和可靠的通信是通过专用的Photon服务器完成的,因此客户端连接不需要1对1。
将想要同步位置信息的物体加上PhotonTransformView,再将PhotonTransformView挂载到PhotonView的观察组件上就可以了。

在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?

【中文标题】在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?【英文标题】:In Unity, how to delete a component via script when deleting another component via the editor? 【发布时间】:2021-11-01 12:35:57 【问题描述】:

上下文:我正在编辑一个预制件,上面有两个组件,都是自定义脚本。

编辑预制件时,我想在删除组件容器同步的同时删除编辑器中的组件容器描述符,方法是右键单击它并单击删除组件。见下图。

在 ContainerDescriptor 中,我参考了 ContainerSync 脚本。

 public class ContainerDescriptor : MonoBehaviour
 
     public ContainerSync containerSync;
 

我尝试使用 ContainerDescriptor 脚本的 OnDestroy() 方法,但是以这种方式删除 ContainerDescriptor 时不会调用它。

【问题讨论】:

【参考方案1】:

On this thread 至少有一个解决方案,如果您像您一样通过上下文菜单删除该组件。

使用[ExecuteAlways],通常仅在 PlayMode 中调用的事件消息调用也会在 Edit 和 Prefab 模式中调用!

你可以做类似的事情,例如

[ExecuteAlways]
public class ContainerDescriptor : MonoBehaviour

     public ContainerSync containerSync;

#if UNITY_EDITOR
     private void OnDestroy ()
     
         if(containerSync)
         
             if(Application.isPlaying)
                 Destroy(containerSync);
             else
                 DestroyImmediate (containerSync);
         
     
#endif

请注意,尽管专门针对预制件,这可能仍然会失败,因为 afaik 既不能在预制件内部使用 Destroy 也不能使用 DestroyImmediate(请参阅 here)

【讨论】:

它似乎也适用于预制件,至少 DestroyImmediate 可以。

以上是关于unity的PUN如何同步自定义脚本的主要内容,如果未能解决你的问题,请参考以下文章

PUN实用API

Unity3D 在自定义脚本中实现Button组件上的OnClick面板

Unity 脚本自定义Mesh物体形状

Unity中实现自定义脚本模版

自定义修改Unity脚本模板

Unity自定义编译器窗口查找脚本