-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathActionNetworkManager.cs
172 lines (131 loc) · 4.87 KB
/
ActionNetworkManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using System.Collections;
using System.Collections.Generic;
using System.IO;
using Niantic.ARDK.AR.Networking;
using Niantic.ARDK.AR.Networking.ARNetworkingEventArgs;
using Niantic.ARDK.Networking;
using Niantic.ARDK.Networking.HLAPI.Object.Unity;
using Niantic.ARDK.Networking.MultipeerNetworkingEventArgs;
using Niantic.ARDK.Utilities.BinarySerialization;
using UnityEngine;
namespace Designium.ARDKHandson1.Sample1
{
public class ActionNetworkManager : MonoBehaviour
{
[SerializeField]
private GameObject ballPrefab;
[SerializeField]
private Camera mainCamera;
private IARNetworking _arNetworking;
private uint dataTag = 10;
private void Awake()
{
ARNetworkingFactory.ARNetworkingInitialized += OnARNetworkingInitialized;
}
void Start()
{
}
void Update()
{
#if UNITY_EDITOR
//
// UnityEditorで動かしてるとき
//
if(Input.GetMouseButtonDown(0)){
//
// 画面がクリックされた時の処理
//
FireBall();
}
#else
//
// ビルドして実機で動かしてるとき
//
if (Input.touchCount > 0)
{
Touch touch0 = Input.GetTouch(0);
if (touch0.phase == TouchPhase.Began)
{
//
// 画面がタッチされた時の処理
//
FireBall();
}
}
#endif
}
private void OnARNetworkingInitialized(AnyARNetworkingInitializedArgs args)
{
//
// ネットワーク初期化完了した場合
//
_arNetworking = args.ARNetworking;
_arNetworking.Networking.PeerDataReceived += OnDidReceiveDataFromPeer;
}
/// <summary>
/// ボールオブジェクトを生成して飛ばします。
/// </summary>
private void FireBall()
{
if (_arNetworking == null || !_arNetworking.Networking.IsConnected)
{
//ネットワーク系の初期化ができてない場合は、追加処理しない
return;
}
//
// 全端末に向け手、ボール発射してほしいことを送信
//
// ボール発射位置と力をかける方向を送信してます。
var data = this.SerializeBallInfo(mainCamera.transform.position, mainCamera.transform.forward);
_arNetworking.Networking.BroadcastData(dataTag, data, TransportType.UnreliableUnordered, true);
}
private void OnDidReceiveDataFromPeer(PeerDataReceivedArgs args)
{
//
// データ受信
//
Debug.Log("データ受信しました。");
if(args.Tag != dataTag){
//
// 意図しないデータだった場合は、追加処理しない
//
return;
}
Vector3[] recieveDataArray = this.DeserializePositionAndRotation(args.CopyData());
Vector3 ballPos = recieveDataArray[0];
Vector3 powerDirection = recieveDataArray[1];
float power = 2.0f;//ボールを飛ばす強さ
GameObject ballObject = GameObject.Instantiate(ballPrefab, ballPos, Quaternion.identity);
ballObject.GetComponent<Rigidbody>().AddForce(powerDirection * power);
}
//参考:https://lightship.dev/docs/ardk/multiplayer/serialization.html
//
// ↓では、データ送受信用にシリアライズ処理をします。
//
private byte[] SerializeBallInfo(Vector3 ballPos, Vector3 powerDirection)
{
using (var stream = new MemoryStream())
{
using (var serializer = new BinarySerializer(stream))
{
serializer.Serialize(ballPos);
serializer.Serialize(powerDirection);
return stream.ToArray();
}
}
}
private Vector3[] DeserializePositionAndRotation(byte[] data)
{
using (var stream = new MemoryStream(data))
{
using (var deserializer = new BinaryDeserializer(stream))
{
var result = new Vector3[2];
result[0] = (Vector3)deserializer.Deserialize(); // position
result[1] = (Vector3)deserializer.Deserialize(); // rotation
return result;
}
}
}
}
}