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の位置を変更している。
Binary file Paper/master_paper.pdf has changed
--- /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;
+    }
+}