rtrt.cs
6.17 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
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//강아지를 부를 수 있게 Mesh Collider 컴포넌트 추가, Mesh에 Husky 추가가 되어 있어야 합니다.
//상호작용창 생성방법 : Hierarchy창 우클릭 - UI - Canvas
//Canvas의 Render Mode는 World Space로 설정, 강아지를 부모 오브젝트로 설정, 기본적으로는 비활성화
//Canvas의 자식오브젝트에는 UI - Text, UI - Button 5개(빵야, 앉아, 엎드려, 먹이주기, 종료)
//추가로 2D Object - Sprite로 빈 스프라이트 생성, Sprite Render에 단색 이미지를 넣어 배경 설정 가능
public class rtrt : MonoBehaviour
{
Animator animator;
Transform camera;
string camera_name = "Camera Rig";//카메라 오브젝트(혹은 그것의 부모 오브젝트)의 이름
float len = 3.0f;//상호작용 창을 띄울 수 있는 거리 (카메라와 강아지 사이의 거리가 len이상일 때 강아지를 클릭하면 강아지가 카메라를 향해 걸어간다)
float husky_speed = 0.02f;//강아지가 카메라를 향해 걸어갈 때 그 속도
public bool clicked = false, active = false, walk, stopwalk, death, sitting, lie, eat;
void Start()
{
animator = GetComponent<Animator>();
}
//Event Trigger - Pointer Click
public void Clicked()
{
clicked = true;
}
//Husky오브젝트 안의 Event Trigger - Pointer Click
//Canvas오브젝트 안의 종료 버튼 Event Trigger - Pointer Click
//빵야 애니메이션의 경우 강아지를 클릭시 idle애니메이션으로 복귀
public void Reset()
{
animator.SetBool("offDeath", true);
}
//Canvas오브젝트 안의 빵야 버튼 Event Trigger - Pointer Click
public void Death_button()
{
death = true;
}
//Canvas오브젝트 안의 앉아 버튼 Event Trigger - Pointer Click
public void Sitting_Button()
{
sitting = true;
}
//Canvas오브젝트 안의 엎드려 버튼 Event Trigger - Pointer Click
public void Lie_Button()
{
lie = true;
}
//Canvas오브젝트 안의 먹이주기 버튼 Event Trigger - Pointer Click
public void Eat_Button()
{
eat = true;
}
void Update()
{
camera = GameObject.Find(camera_name).transform; //카메라 오브젝트의 tranform
Vector3 zero_height_husky = new Vector3(transform.position[0], -3.8f, transform.position[2]); //y값을 0으로 한 강아지 오브젝트의 위치벡터
Vector3 zero_height_camera = new Vector3(camera.position[0], -3.8f, camera.position[2]);//y값을 0으로 한 카메라 오브젝트의 위치벡터
Vector3 s = zero_height_camera - zero_height_husky;
//강아지를 클릭시 특정 거리이상이면 특정 거리 이하가 될 때까지 카메라를 향해 걸어감
if (clicked)
{
if (len * len > len_square(camera.position))
{
active = true;
clicked = false;
animator.SetBool("offWalk", true);
stopwalk = false;
}
else
{
transform.position = Vector3.MoveTowards(transform.position, zero_height_camera, husky_speed);
look_camera(s);
if (stopwalk)
{
walk = false;
}
else
{
walk = true;
stopwalk = true;
}
}
}
if (walk)
{
animator.SetBool("onWalk", true);
animator.SetBool("offWalk", false);
walk = false;
}
else
{
animator.SetBool("onWalk", false);
}
//Death_Button이 실행되면 애니메이션 실행
if (death)
{
animator.SetBool("onDeath", true);
animator.SetBool("offDeath", false);
death = false;
}
else
{
animator.SetBool("onDeath", false);
}
//Sitting_Button이 실행되면 애
if (sitting)
{
animator.SetBool("onSitting", true);
sitting = false;
}
else
{
animator.SetBool("onSitting", false);
}
//Lie_Button이 실행되면 애니메이션 실행
if (lie)
{
animator.SetBool("onLie", true);
lie = false;
}
else
{
animator.SetBool("onLie", false);
}
//Eat_Button이 실행되면 애니메이션 실행
if (eat)
{
animator.SetBool("onEat", true);
eat = false;
}
else
{
animator.SetBool("onEat", false);
}
}
//강아지의 rotation을 카메라를 향하게 하는 함수(Update에서 사용됨)
public void look_camera(Vector3 s)
{
if (s[2] > 0)
{
transform.localEulerAngles = new Vector3(0, 180 / Mathf.Acos(-1) * Mathf.Atan(s[0] / s[2]), 0);
}
else { transform.localEulerAngles = new Vector3(0, (180 / Mathf.Acos(-1) * Mathf.Atan(s[0] / s[2])) + 180, 0); }
}
//사용자가 특정 거리 미만일 때 강아지의 상호작용창 활성화
//Husky오브젝트 안의 총 버튼 Event Trigger - Pointer Click (입력 오브젝트는 Canvas)
public void Active(GameObject obj)
{
if (active && len * len > len_square(camera.position))
{
obj.gameObject.SetActive(true);
active = false;
}
}
//상호작용창 비활성화
//Canvas오브젝트 안의 종료 버튼 Event Trigger - Pointer Click (입력 오브젝트는 Canvas)
public void DeActive(GameObject obj)
{
obj.gameObject.SetActive(false);
}
//강아지와 카메라 사이의 거리를 구하기 위해 만든 함수
float len_square(Vector3 vec)
{
float result = 0;
for (int i = 0; i < 3; i++)
{
result += (vec[i] - transform.position[i]) * (vec[i] - transform.position[i]);
}
return result;
}
}