-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInputController.cs
More file actions
132 lines (101 loc) · 3.83 KB
/
InputController.cs
File metadata and controls
132 lines (101 loc) · 3.83 KB
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;
//ゲーム中のマウスやタッチの入力を管理する
public class InputController : MonoBehaviour
{
[SerializeField]
private float maxScrollSpeed = 0.05f;//マイフレーム処理させないことで処理を軽くさせる
[SerializeField]
private RectTransform handTransform;
[SerializeField]
private GameObject helpUI;
private LineDrawer_v2 lineDrawer;
private enum LineState
{
Wait,
CanDraw,
StartCount,
}
private LineState state = LineState.CanDraw;
private Subject<Unit> _finishDraw = new Subject<Unit>();
//UniRxでプレイヤーが壁描写を終了したことを通知
public IObservable<Unit> finishDraw
{
get { return _finishDraw; }
}
private float intervalTime;
private RectTransform cameraRectTransform;
void Awake()
{
lineDrawer = GetComponent<LineDrawer_v2>();
cameraRectTransform = Camera.main.gameObject.GetComponent<RectTransform>();
}
void Update()
{
//ゲームマネージャーがゲーム開始を判断するまで入力を受け付けない
if (ResourceProvider.i.gameManager.state == GameManager.GameState.Pause) return;
if (state == LineState.Wait) return;
StartCountInterval();
GetMouseInput();
}
//メッシュの生成間隔を制限するメソッド
private void StartCountInterval()
{
if (state != LineState.StartCount) return;
if (intervalTime >= maxScrollSpeed)
{
state = LineState.CanDraw;
intervalTime = 0;
return;
}
intervalTime += Time.deltaTime;
}
//マウスの入力を取得するメソッド
private void GetMouseInput()
{
//入力を始めた場合、以前のメッシュ情報を削除し、入力初めのポジションを取得
if (Input.GetMouseButtonDown(0))
{
lineDrawer.PenDown(CalculateTouchPoint());
helpUI.SetActive(false);
state = LineState.StartCount;
}
else if (Input.GetMouseButton(0) && state == LineState.CanDraw)
{
//入力している間、入力前後の入力位置からメッシュの大きさを計算し更新
lineDrawer.PenMove(CalculateTouchPoint());
state = LineState.StartCount;
if (handTransform != null)
{
handTransform.gameObject.SetActive(true);
handTransform.position = Input.mousePosition;
}
}
else if (Input.GetMouseButtonUp(0))
{
//ドラッグが終了したらUniRxで通知する
_finishDraw.OnNext(Unit.Default);
lineDrawer.PenUp();
if (handTransform != null) handTransform.gameObject.SetActive(false);
}
}
//mousePositionをワールドポジションに変換し、描きたい奥行きを加算した上で返すメソッド
private Vector3 CalculateTouchPoint()
{
var mousePosition = Input.mousePosition;
var cameraTransform = cameraRectTransform == null
? Camera.main.gameObject.transform : cameraRectTransform;
mousePosition = new Vector3(mousePosition.x,
mousePosition.y,
-cameraTransform.position.z);
var screenPoint = Camera.main.ScreenToWorldPoint(mousePosition);
//このスクリプトがアタッチされたオブジェクトのzPositionで壁の奥行きを調整
screenPoint = new Vector3(screenPoint.x,
screenPoint.y,
screenPoint.z + transform.position.z);
return screenPoint;
}
}