Mercurial > hg > Papers > 2022 > riono-master
changeset 32:f6120b4d214a
update Unity chaper
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 05 Feb 2022 01:44:53 +0900 |
parents | 4cb0634a79ff |
children | f71ce2ee12af |
files | Paper/chapter/4-WorkingInUnity.tex Paper/master_paper.pdf Paper/src/Unity/ObjectMoveCodeGear.cs Paper/src/Unity/ObjectMoveListener.cs Paper/src/Unity/ObjectMoveServer.cs Paper/src/Unity/RemoteMoveTest.cs Paper/src/Unity/TransformMoveTest.cs Paper/src/Unity/Vector3Cmd.cs |
diffstat | 8 files changed, 110 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter/4-WorkingInUnity.tex Fri Feb 04 22:17:44 2022 +0900 +++ b/Paper/chapter/4-WorkingInUnity.tex Sat Feb 05 01:44:53 2022 +0900 @@ -53,7 +53,7 @@ \begin{itemize} \item CodeGearを使用した、GameObjectの位置の操作 - \item 同一プロセスでの、RemoteDGMを使用したGameObjectの位置の同期 + \item 同一プロセスでの、複数DGMを使用したGameObjectの位置の同期 \item PC2台を使用した、LAN上でのGameObjectの位置の同期 \end{itemize} @@ -79,15 +79,37 @@ Postメソッドは第一引数にデリゲートの一種であるAction$<$T$>$を渡すため、ラムダ式での記述が可能である。 +\lstinputlisting[label=src:RemoteMoveTest, caption=RemoteDGMでGameObjectの位置の操作の準備を行うScript]{src/Unity/RemoteMoveTest.cs} +\lstinputlisting[label=src:ObjectMoveCodeGear, caption=RemoteDGMでGameObjectの位置の操作を行うCodeGear]{src/Unity/ObjectMoveCodeGear.cs} +\lstinputlisting[label=src:Vector3Cmd, caption=GameObjectの位置データとして送信されるオブジェクトのクラス]{src/Unity/Vector3Cmd.cs} +ソースコード\ref{src:RemoteMoveTest}、\ref{src:ObjectMoveCodeGear}、\ref{src:Vector3Cmd}は同一プロセスにおいて、 +RemoteDGMを使用しGameObjectの位置を操作するScriptである。 +ソースコード\ref{src:RemoteMoveTest}のStartメソッドでは、playerCGMとenemyCGMの2つのDGMを用意し、 +playerCGMの方では他方のenemyCGMをRemoteDGMとして指定を行っている。 +また、enemyCGMではSetupを行い処理の待機状態にしている。 +Updateメソッドでは、このScriptが付与されたGameObjectの位置を取得し、x軸に+3、z軸に+3離れた位置にotherTransformを移動させるようにし、 +送信用クラスに変形を行っている。 +21行目ではotherTransformを持っているenemyCGMではなく、playerCGMからPutを行っている。 +MessagePack CSharpではUnityにも対応しており、Unity APIが提供している値型のVector3やQuaternionなどもSerialize/Deserialize可能である。 +しかし、Christie SharpではDGでデータを管理する際に全ての型に対応できるようObject型にCastをしている。 +このObject型のCastが原因によりVector3型を直接送信することができない。 +そのため、ソースコード\ref{src:Vector3Cmd}のようにデータをプリミティブ型に分割してデータを送信している。 +ソースコード\ref{src:ObjectMoveCodeGear}はソースコード\ref{src:PositionAssignCodeGear}と同様にMainThreadDispatcher.Postによって、 +処理はMain Threadに移譲されて実行される。 - +\lstinputlisting[label=src:ObjectMoveServer, caption=GameObjectの位置をRemoteDGMに送信するScript]{src/Unity/ObjectMoveServer.cs} +\lstinputlisting[label=src:ObjectMoveListener, caption=GameObjectの位置を受信して位置を操作するScript]{src/Unity/ObjectMoveListener.cs} +ソースコード\ref{src:ObjectMoveServer}、\ref{src:ObjectMoveListener}は2台のPCを使用しLAN内でGameObjectの位置を通信して操作するScriptである。 +CGや、送信するDGについては、ソースコード\ref{src:ObjectMoveCodeGear}、\ref{src:Vector3Cmd}を流用している。 - +ソースコード\ref{src:ObjectMoveServer}、\ref{src:ObjectMoveListener}それぞれの3行目ではhostNameを指定しており、通信先のLocal IPアドレスを入力することでSocket通信を行っている。 +ソースコード\ref{src:ObjectMoveServer}は位置データの送信元であり、RemoteDGMとして指定したlistenerに向けて、自身のGameObjectの位置をPutしている。 +ソースコード\ref{src:ObjectMoveListener}は何もデータをPutしておらず、LateUpdateメソッドでSetupを行うことでソースコード\ref{src:ObjectMoveServer}から受け取ったデータを基にGameObjectの位置を変更している。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Unity/ObjectMoveCodeGear.cs Sat Feb 05 01:44:53 2022 +0900 @@ -0,0 +1,11 @@ +public class ObjectMoveCodeGear : CodeGear { + [Peek] private Transform otherTransform; + [Take] public Vector3Cmd newPos; + + public override void Run(CodeGearManager cgm) { + MainThreadDispatcher.Post(_ => { + Vector3 pos = new Vector3(newPos.xAxis, newPos.yAxis, newPos.zAxis); + otherTransform.position = pos; + }, null); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Unity/ObjectMoveListener.cs Sat Feb 05 01:44:53 2022 +0900 @@ -0,0 +1,14 @@ +public class PlayerListener : MonoBehaviour { + private CodeGearManager listenerCGM; + public string hostName; + + void Start() { + listenerCGM = StartCodeGear.CreateCgm(10002); + listenerCGM.Setup(new ObjectMoveCodeGear()); + listenerCGM.GetLocalDGM().Put("otherTransform", transform); + } + + private void LateUpdate() { + listenerCGM.Setup(new ObjectMoveCodeGear()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Unity/ObjectMoveServer.cs Sat Feb 05 01:44:53 2022 +0900 @@ -0,0 +1,16 @@ +public class PlayerManager : MonoBehaviour { + public CodeGearManager playerCGM; + public string hostName; + private Vector3 playerPos; + + void Start() { + playerCGM = StartCodeGear.CreateCgm(10001); + playerCGM.CreateRemoteDGM("listener", hostName, 10002); + } + void Update() { + playerPos = transform.position; + Vector3Cmd vCmd = new Vector3Cmd(playerPos.x, playerPos.y, playerPos.z); + + playerCGM.GetDGM("listener").Put("newPos", vCmd); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Unity/RemoteMoveTest.cs Sat Feb 05 01:44:53 2022 +0900 @@ -0,0 +1,27 @@ +public class RemoteMoveTest : MonoBehaviour { + private CodeGearManager playerCGM; + private CodeGearManager enemyCGM; + public Transform otherTransform; + private Vector3 playerPos; + + void Start() { + playerCGM = StartCodeGear.CreateCgm(10001); + enemyCGM = StartCodeGear.CreateCgm(10002); + playerCGM.CreateRemoteDGM("enemy", "localhost", 10002); + + enemyCGM.Setup(new ObjectMoveCodeGear()); + enemyCGM.GetLocalDGM().Put("otherTransform", transform); + } + + public void Update() { + playerPos = otherTransform.position; + Vector3 newPos = new Vector3(playerPos.x + 3, playerPos.y, playerPos.z + 3); + Vector3Cmd vCmd = new Vector3Cmd(newPos.x, newPos.y, newPos.z); + + playerCGM.GetDGM("enemy").Put("newPos", vCmd); + } + + private void LateUpdate() { + enemyCGM.Setup(new ObjectMoveCodeGear()); + } +}
--- a/Paper/src/Unity/TransformMoveTest.cs Fri Feb 04 22:17:44 2022 +0900 +++ b/Paper/src/Unity/TransformMoveTest.cs Sat Feb 05 01:44:53 2022 +0900 @@ -1,8 +1,7 @@ public class TransformMoveTest : MonoBehaviour { - [SerializeField] private Transform otherTransform; - + private CodeGearManager cgm; + public Transform otherTransform; private Vector3 pos; - private CodeGearManager cgm; void Start() { cgm = StartCodeGear.CreateCgm(10000);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/Unity/Vector3Cmd.cs Sat Feb 05 01:44:53 2022 +0900 @@ -0,0 +1,15 @@ +[MessagePackObject] +public class Vector3Cmd { + [Key("xAxis")] + public float xAxis; + [Key("yAxis")] + public float yAxis; + [Key("zAxis")] + public float zAxis; + + public Vector3Cmd(float xAxis, float yAxis, float zAxis) { + this.xAxis = xAxis; + this.yAxis = yAxis; + this.zAxis = zAxis; + } +}