ð ãã®èšäºã¯ Zenn ã«æçš¿ããå 容ã®ã¢ãŒã«ã€ãã§ãã
ã¯ããã«
Photon Fusionã¯ã髿§èœã»é«æè»æ§ãªãããã¯ãŒã¯åæã·ã¹ãã ãæäŸããæ¬¡äžä»£ãããã¯ãŒã¯ã©ã€ãã©ãªã§ãã
ãã®äžã§ãç¹ã«éèŠãªåœ¹å²ãæ
ã£ãŠããã®ãã[Networked] 屿§ã§ãã
ãã®å±æ§ã䜿ãããšã§ããã¬ã€ã€ãŒã®äœçœ®ãã¢ãã¡ãŒã·ã§ã³ç¶æ ãã²ãŒã å ãªããžã§ã¯ãã®å€å ãªã©ãèªåçã«åæã§ããç ©éãªæåã®ããŒã¿éåä¿¡åŠçãçãããšãã§ããŸãã
æ¬ã·ãªãŒãºã§ã¯ãFusionã®å
éšåæåŠçãæ®µéçã«æãäžããŠè§£èª¬ããŠãããŸãããä»åã¯ã[Networked] 屿§ã®è£åŽã§äœãèµ·ããŠããã®ããã©ã®ããã«ããŠèªååæãå®çŸãããŠããã®ãã詳ããèŠãŠãããŸãã
Fusionã«ããã[Networked]屿§ã®åæåŠçæŠèŠ
[Networked] 屿§ã¯ïŒ
Fusionã§ã¯ã[Networked] 屿§ãä»äžãããããããã£ã¯ãããã¯ãŒã¯ç¶æ
ã®åæå¯Ÿè±¡ ãšããŠæ±ãããŸããããŠãŒã¶ãŒãæåã§åæã³ãŒããæžãå¿
èŠã¯ãããŸããã
ãã®ä»çµã¿ã¯ãUnityãæäŸãã ILPostProcessor API ãæŽ»çšããŠãããC# ã§æžãããã³ãŒãããã«ãåŸã«ILïŒäžéèšèªïŒã¬ãã«ã§èªå倿 ããŠããŸãã
IL
ILã¯ã.NET ã«ãããäžéèšèªã§ãã
Unity ã§ã¯ãC# ã§æžããã¹ã¯ãªããã¯å¿
ããã® IL ãçµç±ããŠãããã€ãã£ãã³ãŒãã«å€æãããŸãã
å ·äœçã«ã¯ã以äžã®ãããªåŠçãè¡ãããŸãïŒ
NetworkedWeavedãšãã屿§ã远å ããŠã該åœããããã£ããããã¯ãŒã¯ç¶æ ãããã¡ã«å²ãåœãŠãããããšãæç€ºgetter/setter ã
NetworkBehaviourã®å éšãããã¡ïŒStateBufferïŒãžã®ã¡ã¢ãªã¢ã¯ã»ã¹ã«å·®ãæ¿ã ãããå®è¡æã«
Spawned()ãããŠããªãå Žåã®ã¢ã¯ã»ã¹å¶éãæ¿å ¥ããã
倿åã®C#ã³ãŒãïŒ
[Networked] private Vector2 _position { get; set; }
IL倿åŸïŒILSpyã§éã³ã³ãã€ã«ããã³ãŒãïŒïŒ
    [Networked]
    [NetworkedWeaved(0, 2)]
    private unsafe Vector2 _position
    {
        get
        {
            if (base.Ptr == null)
            {
                throw new InvalidOperationException("Error when accessing PhotonCapybara._position. Networked properties can only be accessed when Spawned() has been called.");
            }
            return (Vector2)base.Ptr[0];
        }
        set
        {
            if (base.Ptr == null)
            {
                throw new InvalidOperationException("Error when accessing PhotonCapybara._position. Networked properties can only be accessed when Spawned() has been called.");
            }
            Unsafe.Write(base.Ptr + 0, value);
        }
    }
è£è¶³è§£èª¬ïŒ
base.Ptrã¯NetworkBehaviourã«å²ãåœãŠããããããã¯ãŒã¯ç¶æ ã¡ã¢ãªã®å é ãã€ã³ã¿ ã§ããbase.Ptr[0]ã¯ãªãã»ãã0ã®äœçœ®ããããŒã¿ãèªã¿æžãããŸãïŒããã§ã¯_positionã®ããŒã¿ãæ ŒçŽãããŠããïŒUnsafe.Write()ã䜿ãããšã§ãå倿ã䌎ããªãé«éãªãã€ããªæžã蟌㿠ãå¯èœã«ãªããŸãNetworkedWeaved(0, 2)ã®0ã¯ãªãã»ããã€ã³ããã¯ã¹ã2ã¯äœ¿çšã¯ãŒãæ°ïŒ32bitåäœïŒã瀺ããŸã
Networkedå€ã¯ã©ã®ããã«åæãããïŒ
IL倿ããã [Networked] ããããã£ã¯ãNetworkBehaviourã®StateBufferã«æžã蟌ãŸããã ãã§ã¯åæã¯å®äºããŸãã ã
å®éã«ã¯ã以äžã®ãããªã¹ãããã§ãåæãã±ãããã«å«ãŸããŠéä¿¡ãããŸãïŒ
Simulation.Update() å éšã§ StateBuffer ã®å€åãæ€åº
ScanStructForChanges()颿°ã§ãçŸåšã® StateBuffer ãšååã¹ãããã·ã§ãããæ¯èŒããŸããå·®åãããã°ãããããæŽæ°å¯Ÿè±¡ããšããŠããŒã¯ãããŸãã
PreparePacket() ã§åæããŒã¿ããããã¡ã«è©°ãã
å·®åããããã£ãŒã«ãã®ã¿ããéä¿¡ãã±ããçšãããã¡ã«æžãåºãããŸãã
Fusion ã¯ãã®ãšããå¯èœãªéã bitå§çž® ãè¡ã£ãŠåž¯åãç¯çŽããŸãã
éä¿¡âåä¿¡â埩å åŠçïŒDeserializeïŒ
- ãªã¢ãŒãåŽã§ã¯ãåä¿¡ãããã±ãããå
ã« StateBuffer ãäžæžããããããããã£ã®
getçµæãææ°å€ã«ãªããŸãã
- ãªã¢ãŒãåŽã§ã¯ãåä¿¡ãããã±ãããå
ã« StateBuffer ãäžæžããããããããã£ã®
ãã®ããã«ã[Networked] 屿§ã¯ IL倿 â ã¡ã¢ãªæžã蟌㿠â å·®åæœåº â ãã±ããéä¿¡ â åæåæ ã®äžé£ã®æµãã§ãèªåçã«åæåŠçãè¡ãããŠããã®ã§ãã
èŠããªãåæã®ä»çµã¿ãçè§£ããããšã®æå³
[Networked] 屿§ã¯ãäžèŠãã ã®ããŒã¯ã¢ããã®ããã«èŠããŸãããå®éã«ã¯ILã¬ãã«ã§åäœãæ¡åŒµããããã©ãŒãã³ã¹ãšæ±çšæ§ãäž¡ç«ããèšèš ã«ãªã£ãŠããããšãããããŸããã
Fusionãã䜿ããã ãã§ãªããçè§£ããŠäœ¿ããããã«ã¯ãããããä»çµã¿ãç¥ãããšãéåžžã«éèŠã§ãã
ä»åŸã®èšäºã§ã¯ãããã«æ·±ãæãäžããŠãããŸãã
æ¬èšäºã¯Qiitaã§å ¬éããå 容ããZennåãã«å çãããã®ã§ãã