changeset 30:2a9f335e45bd

add source code and update Unity chapter
author riono <e165729@ie.u-ryukyu.ac.jp>
date Fri, 04 Feb 2022 20:47:04 +0900
parents 03402185cb9c
children 4cb0634a79ff
files Paper/chapter/1-Christie.tex Paper/chapter/2-RewriteCS.tex Paper/chapter/3-ChristieSharp.tex Paper/chapter/4-WorkingInUnity.tex Paper/master_paper.pdf Paper/src/Unity/CountUpScript.cs Paper/src/Unity/UnityScriptExample.cs Paper/src/cs/CodeGearExample.cs Paper/src/cs/CountObject.cs Paper/src/cs/CountUpper.cs Paper/src/cs/StartCGExample.cs Paper/src/cs/StartCountUp.cs Paper/src/java/CodeGearExample.java Paper/src/java/CountUpper.java Paper/src/java/StartCGExample.java Paper/src/java/StartCountUp.java
diffstat 16 files changed, 128 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/Paper/chapter/1-Christie.tex	Fri Feb 04 17:57:03 2022 +0900
+++ b/Paper/chapter/1-Christie.tex	Fri Feb 04 20:47:04 2022 +0900
@@ -119,8 +119,8 @@
 以下のソースコード\ref{src:StartCGExample}、\ref{src:CGExample}、\ref{src:CounteObj}はLocalDGMにputしたDGを取り出して表示し、
 インクリメントして10回繰り返す例題である。
 
-\lstinputlisting[label=src:StartCGExample, caption=StartCodeGearの記述例]{src/java/StartCGExample.java}
-\lstinputlisting[label=src:CGExample, caption=CodeGearの記述例]{src/java/CodeGearExample.java}
+\lstinputlisting[label=src:StartCGExample, caption=StartCodeGearの記述例]{src/java/StartCountUp.java}
+\lstinputlisting[label=src:CGExample, caption=CodeGearの記述例]{src/java/CountUpper.java}
 \lstinputlisting[label=src:CounteObj, caption=DGとして送信されるオブジェクトのクラス]{src/java/CountObject.java}
 
 Chrisiteでは、StartCodeGear(以下StartCG)から処理を開始する。
--- a/Paper/chapter/2-RewriteCS.tex	Fri Feb 04 17:57:03 2022 +0900
+++ b/Paper/chapter/2-RewriteCS.tex	Fri Feb 04 20:47:04 2022 +0900
@@ -116,11 +116,11 @@
 \newpage
 
 \lstinputlisting[label=src:CSMspackExample, caption=C\#におけるMessagePackの使用例]{src/cs/MessagePackExample.cs}
-MessagePack CSharpではmsgpack javaと同様にクラスに対してSerializeを行うため、\ref{src:CSMspackExample}の1行目でMessageObject attributeを追加している。
+MessagePack CSharpではmsgpack javaと同様にクラスに対してSerializeを行うため、\ref{src:CSMspackExample}の1行目でMessagePackObject attributeを追加している。
 また、Serializeする変数に対してkeyを設定することができ、indexesとしてのintやstringをkeyとして指定することができる。
 
 データのSerializeにはMessagePackSerializer.Serializeメソッドを使用し、引数として渡したオブジェクトをbyte[]型にSerializeする。
-DeserializeにはMessagePackSerializer.Deserializeメソッドを使用する。Deserializeメソッドはジェネリスク関数であるため、<>内にDeserialize対象のクラスを指定する。
+DeserializeにはMessagePackSerializer.Deserializeメソッドを使用する。Deserializeメソッドはジェネリスク関数であるため、$<>$内にDeserialize対象のクラスを指定する。
 ソースコード\ref{src:CSMspackExample}の22行目ではjson展開の例であり、変数それぞれにkeyを指定していることで展開可能となっている。
 
 \section{送信パケットの修正}
--- a/Paper/chapter/3-ChristieSharp.tex	Fri Feb 04 17:57:03 2022 +0900
+++ b/Paper/chapter/3-ChristieSharp.tex	Fri Feb 04 20:47:04 2022 +0900
@@ -4,8 +4,8 @@
 JavaとC\#は大きく記述方法は変わらず、annotationがattributeになっている点が一番の違いである。
 そのためChristieとChrisite Sharptには互換性があると言える。
 
-\lstinputlisting[label=src:CSStartCGExample, caption=Chrisite SharpにおけるStartCodeGearの記述例]{src/cs/StartCGExample.cs}
-\lstinputlisting[label=src:CSCGExample, caption=Chrisite SharpにおけるCodeGearの記述例]{src/cs/CodeGearExample.cs}
+\lstinputlisting[label=src:CSStartCGExample, caption=Chrisite SharpにおけるStartCodeGearの記述例]{src/cs/StartCountUp.cs}
+\lstinputlisting[label=src:CSCGExample, caption=Chrisite SharpにおけるCodeGearの記述例]{src/cs/CountUpper.cs}
 \lstinputlisting[label=src:CSCountExample, caption=Chrisite SharpにおけるDGとして送信されるオブジェクトのクラス]{src/cs/CountObject.cs}
 
 \section{Topology Manager}
--- a/Paper/chapter/4-WorkingInUnity.tex	Fri Feb 04 17:57:03 2022 +0900
+++ b/Paper/chapter/4-WorkingInUnity.tex	Fri Feb 04 20:47:04 2022 +0900
@@ -1,20 +1,48 @@
 \chapter{Christie SharpのUnity上での動作}
 
+\section{Unity API}
+Unityでは、ゲーム開発を行うためのライブラリとしてUnity APIが公開されている。
+ソースコード\ref{src:UnityExample}はUnity APIを使用したスクリプトの例である。
+Spaceキーを押し続けている間、playerObjectは物理演算に従って、毎フレーム$\vec{A} = (10, 5, 10)$だけ力を加えられ移動する例である。
+4行目では変数が初期化されていないまま使用されているように見えるが、Unityではpublic修飾子を使用するとUnityのエディタ上で事前に変数に代入することが可能になる。
 
-\section{Unity API}
+\lstinputlisting[label=src:UnityExample, caption=Chrisite SharpにおけるStartCodeGearの記述例]{src/Unity/UnityScriptExample.cs}
+
+Unity APIではC\#にはないVector3やGameObject、Rigidbodyなどの特別な型があり、これらはUnityEngineをusingすることで使用可能である。
+またMonoBehaviourを継承することによって、StartメソッドやUpdateメソッドなどのUnity上で決められた、あるタイミングで呼び出される関数を使用することが可能である。
+
+
+Startメソッドはゲームの開始時、1フレーム目が始まる前に1回だけ実行され、主に初期化に使用されることが多い。
+今回はplayerObjectに付与されている物理演算のComponentであるRigidbodyを取得している。
+
+
+UpdateメソッドはStartメソットの実行後に毎フレーム呼び出される関数であり、ゲームのメインロジックで使用されることが多い。
+15行目ではキー入力の有無を確認しており、Spaceキーの入力を監視している。
+続く16行目では、Startメソッドにて取得したRigidbodyに対して、3次元ベクトルを力として与えている。
+これを行うことによって、Spaceキーを押している間$\vec{A} = (10, 5, 10)$がplayerObjectに与えられ、playerObjectは物理演算に従って移動する。
+
+
+UnityではStartメソッドやUpdateメソッドがある代わりに、C\#の一般的な実行メソッドであるMainメソッドによる処理の開始ができない。
+そのため、Unityで処理を行うためには、MonoBehaviourにより提供されているメソッドを通して処理を実行する必要がある。
 
 
 \section{StartCodeGearを使用しないChristie Sharpの実行}
 % 例題など
+% やったこと全部書いたほうがいい/できたこと
+% 多重継承の話
+% LateUpdateの話
+Chrisite SharpではStartCGにMainメソッドを記述してChrisite Sharpを実行したが、Unityで動作させるためにはStartメソッドやUpdeteメソッドを使用す必要がある。
+そのため、Chrisite Sharpの実行にStartCGを使用せずに実行できるよう変更を行った。
+
+\lstinputlisting[label=src:CountUpScript, caption=Unit上でのChrisite Sharpの実行Script]{src/Unity/CountUpScript.cs}
+
+ソースコード\ref{src:CountUpScript}では、StartCGを使用せずに、Unity APIであるStartメソッドよりChrisite Sharpを実行している。
+StartCGは、CGMの初期化や処理の開始位置を明確化させるためのクラスであるため、Christie Sharpの実行に必須ではない。
+また、C\#では多重継承が禁止されている。そのため、StartCGを継承しつつ、MonoBehaviourを継承してStartメソッドを使用する、と言うことはできない。
+そのため可読性が下がってしまう可能性はあるが、CGMの初期化やSetupメソッドを直接Startメソッド内に記述できる。
 
 
 
 
 
 
-
-
-
-
-
-
Binary file Paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/Unity/CountUpScript.cs	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,8 @@
+public class FizzBuzzTest : MonoBehaviour {
+    void Start() {
+        CodeGearManager cgm = StartCodeGear.CreateCgm(10001);
+        cgm.Setup(new CountUpper());
+        CountObject count = new CountObject(1);
+        cgm.GetDGM.Put("count", count);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/Unity/UnityScriptExample.cs	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,19 @@
+using UnityEngine;
+
+public class PlayerMove : MonoBehaviour {
+    public GameObject playerObject;
+    private Rigidbody playerRigidbody;
+    private Vector3 power = new Vector3(10f, 5f, 10f);
+
+    // Start is called before the first frame update
+    void Start() {
+        playerRigidbody = playerObject.GetComponent<Rigidbody>();
+    }
+
+    // Update is called once per frame
+    void Update() {
+        if (Input.GetKey(KeyCode.Space)) {
+            playerRigidbody.AddForce(power);
+        }
+    }
+}
\ No newline at end of file
--- a/Paper/src/cs/CodeGearExample.cs	Fri Feb 04 17:57:03 2022 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-public class CodeGearExample : CodeGear {
-    [Take] public CountObject count;
-
-    public override void Run(CodeGearManager cgm) {
-        Console.WriteLine(count);
-
-        if (count < 10) {
-            cgm.Setup(new CodeGearExample());
-            count.number += 1;
-            put("count", count);
-        } else {
-            cgm.GetLocalDGM().Finish();
-        }
-    }
-}
\ No newline at end of file
--- a/Paper/src/cs/CountObject.cs	Fri Feb 04 17:57:03 2022 +0900
+++ b/Paper/src/cs/CountObject.cs	Fri Feb 04 20:47:04 2022 +0900
@@ -1,4 +1,4 @@
-[MessageObject]
+[MessagePackObject]
 public class CountObject {
     public int number;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/cs/CountUpper.cs	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,15 @@
+public class CountUpper : CodeGear {
+    [Take] public CountObject count;
+
+    public override void Run(CodeGearManager cgm) {
+        Console.WriteLine(count.number);
+
+        if (count.number < 10) {
+            cgm.Setup(new CountUpper());
+            count.number += 1;
+            put("count", count);
+        } else {
+            cgm.GetLocalDGM().Finish();
+        }
+    }
+}
\ No newline at end of file
--- a/Paper/src/cs/StartCGExample.cs	Fri Feb 04 17:57:03 2022 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-public class StartCGExample : StartCodeGear {
-    public StartCGExample(CodeGearManager cgm) : base(cgm) { }
-
-    public static void Main(string[] args) {
-        StartCGExample start = StartCGExample(createCGM(10001));
-    }
-
-    public override void Run(CodeGearManager cgm) {
-        cgm.Setup(new CodeGearExample());
-        CountObject count = new CountObject(1);
-        put("count", count);
-    }
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/cs/StartCountUp.cs	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,13 @@
+public class StartCountUp : StartCodeGear {
+    public StartCountUp(CodeGearManager cgm) : base(cgm) { }
+
+    public static void Main(string[] args) {
+        StartCountUp start = StartCountUp(createCGM(10001));
+    }
+
+    public override void Run(CodeGearManager cgm) {
+        cgm.Setup(new CountUpper());
+        CountObject count = new CountObject(1);
+        put("count", count);
+    }
+}
\ No newline at end of file
--- a/Paper/src/java/CodeGearExample.java	Fri Feb 04 17:57:03 2022 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-public class CodeGearExample extends CodeGear {
-    @Take
-    public CountObject count;
-
-    @Override
-    protected void run(CodeGearManager cgm) {
-        System.out.println(count);
-        
-        if (count < 10) {
-            cgm.setup(new CodeGearExample());
-            count.number += 1;
-            put("count", count);
-        } else {
-            cgm.getLocalDGM().finish();
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/java/CountUpper.java	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,17 @@
+public class CountUpper extends CodeGear {
+    @Take
+    public CountObject count;
+
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.println(count);
+        
+        if (count < 10) {
+            cgm.setup(new CountUpper());
+            count.number += 1;
+            put("count", count);
+        } else {
+            cgm.getLocalDGM().finish();
+        }
+    }
+}
--- a/Paper/src/java/StartCGExample.java	Fri Feb 04 17:57:03 2022 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-public class StartCGExample extends StartCodeGear {
-    public StartCGExample(CodeGearManager cgm) { super(cgm); }
-
-    public static void main(String args[]) {
-        StartCGExample start = StartCGExample(createCGM(10001));
-    }
-    
-    @Override
-    protected void run(CodeGearManager cgm) {
-        cgm.setup(new CodeGearExample());
-        CountObject count = new CountObject(1);
-        put("count", count);
-    }
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/java/StartCountUp.java	Fri Feb 04 20:47:04 2022 +0900
@@ -0,0 +1,14 @@
+public class StartCountup extends StartCodeGear {
+    public StartCountup(CodeGearManager cgm) { super(cgm); }
+
+    public static void main(String args[]) {
+        StartCountup start = StartCountup(createCGM(10001));
+    }
+    
+    @Override
+    protected void run(CodeGearManager cgm) {
+        cgm.setup(new CountUpper());
+        CountObject count = new CountObject(1);
+        put("count", count);
+    }
+}
\ No newline at end of file