Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
R
RhythmKata
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
13정준영
RhythmKata
Commits
195d8379
Commit
195d8379
authored
Nov 25, 2019
by
13정준영
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
노트 시스템 최종
parent
39b775a6
Changes
18
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
505 additions
and
37 deletions
+505
-37
DefaultNote 1.mat
RhythmKata/Assets/Materials/DefaultNote 1.mat
+108
-0
DefaultNote 1.mat.meta
RhythmKata/Assets/Materials/DefaultNote 1.mat.meta
+8
-0
DefaultNote.mat
RhythmKata/Assets/Materials/DefaultNote.mat
+1
-1
ReloadNote.prefab
RhythmKata/Assets/Prefabs/ReloadNote.prefab
+105
-9
Precision Strike.bms
RhythmKata/Assets/Resources/Level/Precision Strike.bms
+1
-0
reload_note_perfect.wav
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav
+0
-0
reload_note_perfect.wav.asd
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav.asd
+0
-0
reload_note_perfect.wav.asd.meta
...ata/Assets/Resources/SFX/reload_note_perfect.wav.asd.meta
+7
-0
reload_note_perfect.wav.meta
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav.meta
+22
-0
Level.cs
RhythmKata/Assets/Scripts/Core/Level.cs
+24
-1
Note.cs
RhythmKata/Assets/Scripts/Core/Note.cs
+48
-6
EdgeNoteObject.cs
RhythmKata/Assets/Scripts/EdgeNoteObject.cs
+2
-2
ForwardNoteObject.cs
RhythmKata/Assets/Scripts/ForwardNoteObject.cs
+2
-4
MotionTracker.cs
RhythmKata/Assets/Scripts/MotionTracker.cs
+51
-0
MotionTracker.cs.meta
RhythmKata/Assets/Scripts/MotionTracker.cs.meta
+11
-0
NoteObject.cs
RhythmKata/Assets/Scripts/NoteObject.cs
+1
-1
PlayEngine.cs
RhythmKata/Assets/Scripts/PlayEngine.cs
+35
-4
ReloadNoteObject.cs
RhythmKata/Assets/Scripts/ReloadNoteObject.cs
+79
-9
No files found.
RhythmKata/Assets/Materials/DefaultNote 1.mat
0 → 100644
View file @
195d8379
%YAML
1.1
%TAG
!u!
tag:unity3d.com,2011:
---
!u!21
&2100000
Material
:
serializedVersion
:
6
m_ObjectHideFlags
:
0
m_CorrespondingSourceObject
:
{
fileID
:
0
}
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
m_Name
:
DefaultNote
m_Shader
:
{
fileID
:
4800000
,
guid
:
19d29d358ae9fed4b8a0fd347863afc5
,
type
:
3
}
m_ShaderKeywords
:
_EMISSION _SPECULARHIGHLIGHTS_OFF
m_LightmapFlags
:
1
m_EnableInstancingVariants
:
0
m_DoubleSidedGI
:
0
m_CustomRenderQueue
:
-1
stringTagMap
:
{}
disabledShaderPasses
:
[]
m_SavedProperties
:
serializedVersion
:
3
m_TexEnvs
:
-
_AlphaTex
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_BumpMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_DecalTex
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_DetailAlbedoMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_DetailMask
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_DetailNormalMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_EmissionMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_MainTex
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_MetallicGlossMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_OcclusionMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_ParallaxMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
-
_SpecGlossMap
:
m_Texture
:
{
fileID
:
0
}
m_Scale
:
{
x
:
1
,
y
:
1
}
m_Offset
:
{
x
:
0
,
y
:
0
}
m_Floats
:
-
PixelSnap
:
0
-
_BumpScale
:
1
-
_ColorMask
:
15
-
_Cutoff
:
0.5
-
_DetailNormalMapScale
:
1
-
_DstBlend
:
0
-
_EnableExternalAlpha
:
0
-
_Fresnel
:
2
-
_FresnelAmount
:
0.31
-
_GlossMapScale
:
1
-
_Glossiness
:
0
-
_GlossyReflections
:
1
-
_Metallic
:
1
-
_Mode
:
0
-
_NewOutline
:
0.005
-
_OcclusionStrength
:
1
-
_Outline
:
0.02
-
_Parallax
:
0.02
-
_SmoothnessTextureChannel
:
0
-
_SpecularHighlights
:
0
-
_SrcBlend
:
1
-
_Stencil
:
0
-
_StencilComp
:
8
-
_StencilOp
:
0
-
_StencilReadMask
:
255
-
_StencilWriteMask
:
255
-
_UVSec
:
0
-
_UseUIAlphaClip
:
0
-
_ZWrite
:
1
-
_ccccc
:
0.2393162
m_Colors
:
-
_Color
:
{
r
:
0
,
g
:
0
,
b
:
0
,
a
:
1
}
-
_EmissionColor
:
{
r
:
1
,
g
:
1
,
b
:
1
,
a
:
1
}
-
_Flip
:
{
r
:
1
,
g
:
1
,
b
:
1
,
a
:
1
}
-
_OutlineColor
:
{
r
:
0
,
g
:
0
,
b
:
0
,
a
:
1
}
-
_RendererColor
:
{
r
:
1
,
g
:
1
,
b
:
1
,
a
:
1
}
-
_SpecColor
:
{
r
:
0.19999996
,
g
:
0.19999996
,
b
:
0.19999996
,
a
:
1
}
-
_node_3119
:
{
r
:
0.5
,
g
:
0.5
,
b
:
0.5
,
a
:
1
}
RhythmKata/Assets/Materials/DefaultNote 1.mat.meta
0 → 100644
View file @
195d8379
fileFormatVersion: 2
guid: c1f601b048926674b8386fa6ef9e7f15
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
RhythmKata/Assets/Materials/DefaultNote.mat
View file @
195d8379
...
...
@@ -76,7 +76,7 @@ Material:
-
_DstBlend
:
0
-
_EnableExternalAlpha
:
0
-
_Fresnel
:
2
-
_FresnelAmount
:
0.
2
-
_FresnelAmount
:
0.
31
-
_GlossMapScale
:
1
-
_Glossiness
:
0
-
_GlossyReflections
:
1
...
...
RhythmKata/Assets/Prefabs/ReloadNote.prefab
View file @
195d8379
...
...
@@ -30,6 +30,7 @@ Transform:
m_Children
:
-
{
fileID
:
6879579829741053864
}
-
{
fileID
:
6879579829926966544
}
-
{
fileID
:
2808715225732087063
}
m_Father
:
{
fileID
:
0
}
m_RootOrder
:
0
m_LocalEulerAnglesHint
:
{
x
:
0
,
y
:
0
,
z
:
0
}
...
...
@@ -48,10 +49,13 @@ MonoBehaviour:
endPoint
:
{
x
:
0
,
y
:
0
,
z
:
0
}
maxRemainedTime
:
5
perfectZ
:
50
hitSfx
:
[]
hitSfx
:
-
{
fileID
:
8300000
,
guid
:
a23aad6537568134a9861f2d338e83b8
,
type
:
3
}
-
{
fileID
:
0
}
cartridges
:
-
{
fileID
:
6879579829741053864
}
-
{
fileID
:
6879579829926966544
}
text
:
{
fileID
:
2808715225732087063
}
---
!u!1
&6879579829741053867
GameObject
:
m_ObjectHideFlags
:
0
...
...
@@ -78,13 +82,13 @@ Transform:
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
m_GameObject
:
{
fileID
:
6879579829741053867
}
m_LocalRotation
:
{
x
:
-0
,
y
:
-0
,
z
:
-0
,
w
:
1
}
m_LocalPosition
:
{
x
:
0.
3
,
y
:
0
,
z
:
0
}
m_LocalScale
:
{
x
:
0.
1
,
y
:
0.3
,
z
:
0.1
}
m_LocalRotation
:
{
x
:
0
,
y
:
1
,
z
:
0
,
w
:
0
}
m_LocalPosition
:
{
x
:
0.
2
,
y
:
0
,
z
:
0
}
m_LocalScale
:
{
x
:
0.
025
,
y
:
0.15
,
z
:
0.05
}
m_Children
:
[]
m_Father
:
{
fileID
:
6879579829033429646
}
m_RootOrder
:
0
m_LocalEulerAnglesHint
:
{
x
:
0
,
y
:
0
,
z
:
0
}
m_LocalEulerAnglesHint
:
{
x
:
0
,
y
:
18
0
,
z
:
0
}
---
!u!33
&6879579829741053871
MeshFilter
:
m_ObjectHideFlags
:
0
...
...
@@ -110,7 +114,7 @@ MeshRenderer:
m_RenderingLayerMask
:
1
m_RendererPriority
:
0
m_Materials
:
-
{
fileID
:
10303
,
guid
:
0000000000000000f000000000000000
,
type
:
0
}
-
{
fileID
:
2100000
,
guid
:
c1f601b048926674b8386fa6ef9e7f15
,
type
:
2
}
m_StaticBatchInfo
:
firstSubMesh
:
0
subMeshCount
:
0
...
...
@@ -171,8 +175,8 @@ Transform:
m_PrefabAsset
:
{
fileID
:
0
}
m_GameObject
:
{
fileID
:
6879579829926966572
}
m_LocalRotation
:
{
x
:
-0
,
y
:
-0
,
z
:
-0
,
w
:
1
}
m_LocalPosition
:
{
x
:
-0.
3
,
y
:
0
,
z
:
0
}
m_LocalScale
:
{
x
:
0.
1
,
y
:
0.3
,
z
:
0.1
}
m_LocalPosition
:
{
x
:
-0.
2
,
y
:
0
,
z
:
0
}
m_LocalScale
:
{
x
:
0.
025
,
y
:
0.15
,
z
:
0.05
}
m_Children
:
[]
m_Father
:
{
fileID
:
6879579829033429646
}
m_RootOrder
:
1
...
...
@@ -202,7 +206,7 @@ MeshRenderer:
m_RenderingLayerMask
:
1
m_RendererPriority
:
0
m_Materials
:
-
{
fileID
:
10303
,
guid
:
0000000000000000f000000000000000
,
type
:
0
}
-
{
fileID
:
2100000
,
guid
:
c1f601b048926674b8386fa6ef9e7f15
,
type
:
2
}
m_StaticBatchInfo
:
firstSubMesh
:
0
subMeshCount
:
0
...
...
@@ -236,3 +240,95 @@ BoxCollider:
serializedVersion
:
2
m_Size
:
{
x
:
1
,
y
:
1
,
z
:
1
}
m_Center
:
{
x
:
0
,
y
:
0
,
z
:
0
}
---
!u!1
&6961112589851847313
GameObject
:
m_ObjectHideFlags
:
0
m_CorrespondingSourceObject
:
{
fileID
:
0
}
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
serializedVersion
:
6
m_Component
:
-
component
:
{
fileID
:
2808715225732087063
}
-
component
:
{
fileID
:
7955947371106866757
}
-
component
:
{
fileID
:
4067875191153338803
}
m_Layer
:
0
m_Name
:
New Text
m_TagString
:
Untagged
m_Icon
:
{
fileID
:
0
}
m_NavMeshLayer
:
0
m_StaticEditorFlags
:
0
m_IsActive
:
1
---
!u!4
&2808715225732087063
Transform
:
m_ObjectHideFlags
:
0
m_CorrespondingSourceObject
:
{
fileID
:
0
}
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
m_GameObject
:
{
fileID
:
6961112589851847313
}
m_LocalRotation
:
{
x
:
-0
,
y
:
-0
,
z
:
-0
,
w
:
1
}
m_LocalPosition
:
{
x
:
0
,
y
:
0
,
z
:
0
}
m_LocalScale
:
{
x
:
1
,
y
:
1
,
z
:
1
}
m_Children
:
[]
m_Father
:
{
fileID
:
6879579829033429646
}
m_RootOrder
:
2
m_LocalEulerAnglesHint
:
{
x
:
0
,
y
:
0
,
z
:
0
}
---
!u!23
&7955947371106866757
MeshRenderer
:
m_ObjectHideFlags
:
0
m_CorrespondingSourceObject
:
{
fileID
:
0
}
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
m_GameObject
:
{
fileID
:
6961112589851847313
}
m_Enabled
:
1
m_CastShadows
:
1
m_ReceiveShadows
:
1
m_DynamicOccludee
:
1
m_MotionVectors
:
1
m_LightProbeUsage
:
1
m_ReflectionProbeUsage
:
1
m_RenderingLayerMask
:
1
m_RendererPriority
:
0
m_Materials
:
-
{
fileID
:
10100
,
guid
:
0000000000000000e000000000000000
,
type
:
0
}
m_StaticBatchInfo
:
firstSubMesh
:
0
subMeshCount
:
0
m_StaticBatchRoot
:
{
fileID
:
0
}
m_ProbeAnchor
:
{
fileID
:
0
}
m_LightProbeVolumeOverride
:
{
fileID
:
0
}
m_ScaleInLightmap
:
1
m_ReceiveGI
:
1
m_PreserveUVs
:
0
m_IgnoreNormalsForChartDetection
:
0
m_ImportantGI
:
0
m_StitchLightmapSeams
:
1
m_SelectedEditorRenderState
:
3
m_MinimumChartSize
:
4
m_AutoUVMaxDistance
:
0.5
m_AutoUVMaxAngle
:
89
m_LightmapParameters
:
{
fileID
:
0
}
m_SortingLayerID
:
0
m_SortingLayer
:
0
m_SortingOrder
:
0
---
!u!102
&4067875191153338803
TextMesh
:
serializedVersion
:
3
m_ObjectHideFlags
:
0
m_CorrespondingSourceObject
:
{
fileID
:
0
}
m_PrefabInstance
:
{
fileID
:
0
}
m_PrefabAsset
:
{
fileID
:
0
}
m_GameObject
:
{
fileID
:
6961112589851847313
}
m_Text
:
RELOAD!
m_OffsetZ
:
0
m_CharacterSize
:
1
m_LineSpacing
:
1
m_Anchor
:
7
m_Alignment
:
1
m_TabSize
:
4
m_FontSize
:
0
m_FontStyle
:
0
m_RichText
:
1
m_Font
:
{
fileID
:
10102
,
guid
:
0000000000000000e000000000000000
,
type
:
0
}
m_Color
:
serializedVersion
:
2
rgba
:
4294967295
RhythmKata/Assets/Resources/Level/Precision Strike.bms
View file @
195d8379
...
...
@@ -22,6 +22,7 @@
#00113:E1
#00114:E3
#00116:E2
#00312:37
...
...
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav
0 → 100644
View file @
195d8379
File added
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav.asd
0 → 100644
View file @
195d8379
File added
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav.asd.meta
0 → 100644
View file @
195d8379
fileFormatVersion: 2
guid: bba8ebc9e7d332b4d8c3b8ec6489bbfa
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
RhythmKata/Assets/Resources/SFX/reload_note_perfect.wav.meta
0 → 100644
View file @
195d8379
fileFormatVersion: 2
guid: a23aad6537568134a9861f2d338e83b8
AudioImporter:
externalObjects: {}
serializedVersion: 6
defaultSettings:
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
preloadAudioData: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:
RhythmKata/Assets/Scripts/Core/Level.cs
View file @
195d8379
...
...
@@ -30,10 +30,33 @@ class Level
}
}
public
void
HandleMotion
(
PlayerMotion
motion
)
{
foreach
(
var
n
in
notes
)
{
ActionNote
note
=
n
as
ActionNote
;
if
(
note
!=
null
&&
note
.
IsActive
)
{
if
(
Math
.
Abs
(
note
.
Time
-
motion
.
time
)
<
0.05f
)
{
if
(
note
.
CheckMotion
(
motion
)
==
JudgeType
.
Hit
)
{
JudgeResult
result
=
new
JudgeResult
();
result
.
correctHand
=
true
;
result
.
type
=
JudgeType
.
Perfect
;
note
.
HandleJudge
(
result
);
note
.
Deactivate
();
break
;
}
}
}
}
}
private
JudgeResult
Judge
(
PlayerInput
input
,
Note
note
)
{
var
judge
=
new
JudgeResult
();
var
hit
=
note
.
CheckHit
(
input
.
ray
);
var
hit
=
note
.
CheckHit
(
input
);
judge
.
near
=
false
;
judge
.
type
=
JudgeType
.
Ignore
;
...
...
RhythmKata/Assets/Scripts/Core/Note.cs
View file @
195d8379
...
...
@@ -64,11 +64,11 @@ abstract class Note
}
}
public
virtual
HitType
CheckHit
(
Ray
ray
)
public
virtual
HitType
CheckHit
(
PlayerInput
input
)
{
// add near support
if
(
noteObject
.
IsHit
(
ray
))
if
(
noteObject
.
IsHit
(
input
))
{
return
HitType
.
Hit
;
}
else
...
...
@@ -146,7 +146,11 @@ abstract class Note
break
;
// TODO : add action notes
case
"16"
:
// 1p forth lane: EDGE RIGHT HAND
note
=
new
ReloadNote
();
handType
=
HandType
.
None
;
break
;
default
:
return
null
;
...
...
@@ -249,12 +253,50 @@ class EdgeNote : Note
}
}
abstract
class
ActionNote
:
Note
{
public
abstract
JudgeType
CheckMotion
(
PlayerMotion
motion
);
}
class
ReloadNote
:
ActionNote
{
private
int
index
;
public
override
JudgeType
CheckMotion
(
PlayerMotion
motion
)
{
if
(
CheckHand
(
motion
.
rightHand
)
&&
CheckHand
(
motion
.
leftHand
))
{
return
JudgeType
.
Hit
;
}
return
JudgeType
.
Miss
;
}
private
bool
CheckHand
(
MotionTracker
hand
)
{
return
Vector3
.
Dot
(
hand
.
Velocity
,
Vector3
.
down
)
>
0.002
;
}
protected
override
NoteObject
CreateNoteObjectImpl
()
{
var
obj
=
MonoBehaviour
.
Instantiate
<
ReloadNoteObject
>(
PlayEngine
.
inst
.
ReloadNoteObject
);
obj
.
Init
();
return
obj
;
}
protected
override
void
FromBmsNum
(
string
num
)
{
}
}
public
enum
NoteType
{
Front
,
Rear
,
Edge
,
Action
Reload
}
public
enum
HandType
...
...
RhythmKata/Assets/Scripts/EdgeNoteObject.cs
View file @
195d8379
...
...
@@ -51,8 +51,8 @@ public class EdgeNoteObject : NoteObject
transform
.
position
=
endPoint
+
new
Vector3
(
0
,
0
,
300
)
*
remainedTime
;
}
public
override
bool
IsHit
(
Ray
ray
)
public
override
bool
IsHit
(
PlayerInput
input
)
{
return
Mathf
.
Abs
(
Mathf
.
Acos
(
Vector3
.
Dot
(
direction
.
normalized
,
ray
.
direction
)))
<
30
;
return
Mathf
.
Abs
(
Mathf
.
Acos
(
Vector3
.
Dot
(
direction
.
normalized
,
input
.
ray
.
direction
)))
<
30
;
}
}
\ No newline at end of file
RhythmKata/Assets/Scripts/ForwardNoteObject.cs
View file @
195d8379
...
...
@@ -24,8 +24,6 @@ public class ForwardNoteObject : NoteObject
Ray
ray
=
new
Ray
(
Vector3
.
zero
,
endPoint
.
normalized
);
endPoint
=
ray
.
GetPoint
(
perfectZ
);
Debug
.
Log
(
endPoint
);
ring
=
IngameUIManager
.
inst
.
AddNoteRingUI
();
ring
.
position
=
endPoint
;
ring
.
LookAt
(
Vector3
.
zero
);
...
...
@@ -103,9 +101,9 @@ public class ForwardNoteObject : NoteObject
img
.
color
=
color
;
}
public
override
bool
IsHit
(
Ray
ray
)
public
override
bool
IsHit
(
PlayerInput
input
)
{
RaycastHit
hit
;
return
GetComponent
<
Collider
>().
Raycast
(
ray
,
out
hit
,
1000
);
return
GetComponent
<
Collider
>().
Raycast
(
input
.
ray
,
out
hit
,
1000
);
}
}
RhythmKata/Assets/Scripts/MotionTracker.cs
0 → 100644
View file @
195d8379
using
UnityEngine
;
public
class
MotionTracker
{
private
Vector3
lastPosition
;
private
Vector3
currentPosition
;
private
bool
first
;
private
bool
active
;
public
bool
IsActive
{
get
=>
active
;
}
public
Vector3
Velocity
{
get
=>
currentPosition
-
lastPosition
;
}
public
MotionTracker
()
{
lastPosition
=
Vector3
.
zero
;
currentPosition
=
Vector3
.
zero
;
first
=
true
;
active
=
true
;
}
public
void
FeedPosition
(
Vector3
pos
)
{
if
(
first
)
{
lastPosition
=
currentPosition
=
pos
;
first
=
false
;
}
else
{
lastPosition
=
currentPosition
;
currentPosition
=
pos
;
}
}
public
void
Deactivate
()
{
first
=
true
;
active
=
false
;
}
public
void
Activate
()
{
active
=
true
;
}
}
RhythmKata/Assets/Scripts/MotionTracker.cs.meta
0 → 100644
View file @
195d8379
fileFormatVersion: 2
guid: 72d3352ff76a52f4f88dfd64f7634f14
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
RhythmKata/Assets/Scripts/NoteObject.cs
View file @
195d8379
...
...
@@ -88,7 +88,7 @@ public abstract class NoteObject : MonoBehaviour
transform
.
position
=
new
Vector3
(
t
*
endPoint
.
x
,
t
*
endPoint
.
y
,
endPoint
.
z
+
z
);
}
public
abstract
bool
IsHit
(
Ray
ray
);
public
abstract
bool
IsHit
(
PlayerInput
ray
);
private
IEnumerator
DissolveRoutine
()
{
...
...
RhythmKata/Assets/Scripts/PlayEngine.cs
View file @
195d8379
...
...
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using
UnityEngine
;
using
Valve.VR
;
using
System
;
using
Valve.VR.InteractionSystem
;
[
RequireComponent
(
typeof
(
AudioSource
))]
public
class
PlayEngine
:
SingletonBehaviour
<
PlayEngine
>
...
...
@@ -10,6 +11,8 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
public
LevelScriptableObject
[]
levelList
;
public
ForwardNoteObject
ForwardNoteObject
;
public
EdgeNoteObject
[]
EdgeNoteObjects
=
new
EdgeNoteObject
[
4
];
public
ReloadNoteObject
ReloadNoteObject
;
private
double
startTime
;
private
Level
level
;
...
...
@@ -35,6 +38,9 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
public
GameObject
player
;
private
MotionTracker
leftHandTracker
=
new
MotionTracker
();
private
MotionTracker
rightHandTracker
=
new
MotionTracker
();
private
int
combo
;
private
int
score
;
...
...
@@ -88,6 +94,9 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
var
leftHandObject
=
handObjects
[
0
];
var
rightHandObject
=
handObjects
[
1
];
TrackHand
(
leftHandObject
,
leftHandTracker
);
TrackHand
(
rightHandObject
,
rightHandTracker
);
level
.
UpdateNotes
(
playbackTime
);
if
(
Input
.
GetKeyDown
(
KeyCode
.
Alpha1
))
...
...
@@ -107,7 +116,6 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
try
// when no VR device is available, SteamVR causes an error.
{
// TODO: handle vr input
if
(
fire
.
GetStateDown
(
leftHand
))
{
input
.
hand
=
HandType
.
Left
;
...
...
@@ -118,7 +126,6 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
input
.
ray
=
gun
.
GetRay
();
gun
.
Fire
();
Debug
.
DrawRay
(
input
.
ray
.
origin
,
input
.
ray
.
direction
,
Color
.
magenta
,
1
);
level
.
HandleInput
(
input
);
}
}
...
...
@@ -131,10 +138,16 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
input
.
ray
=
gun
.
GetRay
();
gun
.
Fire
();
Debug
.
DrawRay
(
input
.
ray
.
origin
,
input
.
ray
.
direction
,
Color
.
cyan
,
1
);
level
.
HandleInput
(
input
);
}
}
PlayerMotion
motion
=
new
PlayerMotion
();
motion
.
leftHand
=
leftHandTracker
;
motion
.
rightHand
=
rightHandTracker
;
motion
.
time
=
playbackTime
;
level
.
HandleMotion
(
motion
);
}
catch
(
NullReferenceException
e
)
{
...
...
@@ -159,6 +172,18 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
}
}
private
void
TrackHand
(
Hand
handObject
,
MotionTracker
tracker
)
{
if
(
handObject
)
{
tracker
.
Activate
();
tracker
.
FeedPosition
(
handObject
.
transform
.
position
);
}
else
{
tracker
.
Deactivate
();
}
}
// Simple implementations of Combo, Score UIs
// It needs to be changed if PlayEngine don't have any responsibilities of score & combo
public
void
HandleNoteJudge
(
JudgeType
type
)
...
...
@@ -204,8 +229,14 @@ public class PlayEngine : SingletonBehaviour<PlayEngine>
public
class
PlayerInput
{
// TODO: make'em properties
public
Ray
ray
;
public
HandType
hand
;
public
double
time
;
}
public
class
PlayerMotion
{
public
MotionTracker
leftHand
;
public
MotionTracker
rightHand
;
public
double
time
;
}
\ No newline at end of file
RhythmKata/Assets/Scripts/ReloadNoteObject.cs
View file @
195d8379
...
...
@@ -6,31 +6,101 @@ public class ReloadNoteObject : NoteObject
{
[
SerializeField
]
private
Transform
[]
cartridges
=
new
Transform
[
2
];
[
SerializeField
]
private
Transform
text
;
private
void
Update
()
{
cartridges
[
0
].
Rotate
(
new
Vector3
(
0
,
180
*
Time
.
deltaTime
,
0
));
cartridges
[
1
].
Rotate
(
new
Vector3
(
0
,
-
180
*
Time
.
deltaTime
,
0
));
cartridges
[
0
].
Rotate
(
new
Vector3
(
540
*
Time
.
deltaTime
,
0
,
0
));
cartridges
[
1
].
Rotate
(
new
Vector3
(
-
540
*
Time
.
deltaTime
,
0
,
0
));
}
public
override
void
NoteHit
(
JudgeResult
judge
)
{
PlayJudgeSfx
(
judge
);
GameObject
hitEffect
=
null
;
// hit effect
if
(
judge
.
type
==
JudgeType
.
Perfect
)
hitEffect
=
PlayEngine
.
inst
.
hitEffectPrefabs
[
0
];
if
(
judge
.
type
==
JudgeType
.
Hit
)
hitEffect
=
PlayEngine
.
inst
.
hitEffectPrefabs
[
1
];
if
(
judge
.
type
==
JudgeType
.
Miss
)
hitEffect
=
PlayEngine
.
inst
.
hitEffectPrefabs
[
2
];
OnNoteHit
?.
Invoke
(
judge
);
if
(
hitEffect
&&
judge
.
type
!=
JudgeType
.
Ignore
)
{
Instantiate
(
hitEffect
,
transform
.
position
,
Quaternion
.
identity
);
StartCoroutine
(
DissolveRoutine
());
PlayEngine
.
inst
.
HandleNoteJudge
(
judge
.
type
);
}
}
p
ublic
override
bool
IsHit
(
Ray
ray
)
p
rivate
IEnumerator
DissolveRoutine
(
)
{
throw
new
System
.
NotImplementedException
();
Material
mat
=
new
Material
(
Shader
.
Find
(
"Unlit/Dissolve"
));
MeshRenderer
[]
mrs
=
GetComponentsInChildren
<
MeshRenderer
>();
foreach
(
var
mr
in
mrs
)
{
mat
.
SetColor
(
"_Color"
,
mr
.
material
.
color
);
mat
.
SetColor
(
"_Glow"
,
(
Color
.
white
+
mr
.
material
.
color
)
/
2
);
mr
.
material
=
mat
;
Texture2D
noise
=
new
Texture2D
(
100
,
100
);
float
scale
=
UnityEngine
.
Random
.
Range
(
20
,
50
);
for
(
int
i
=
0
;
i
<
noise
.
width
;
++
i
)
{
for
(
int
j
=
0
;
j
<
noise
.
height
;
++
j
)
{
float
noiseVal
=
Mathf
.
PerlinNoise
(
scale
*
i
/
noise
.
width
,
scale
*
j
/
noise
.
height
);
noise
.
SetPixel
(
i
,
j
,
new
Color
(
noiseVal
,
noiseVal
,
noiseVal
,
1
));
}
}
noise
.
Apply
();
mat
.
SetTexture
(
"_NoiseTex"
,
noise
);
const
float
time
=
0.5f
;
for
(
float
t
=
0
;
t
<
time
;
t
+=
Time
.
deltaTime
)
{
mat
.
SetFloat
(
"_Threshold"
,
t
/
time
);
mat
.
SetColor
(
"_Color"
,
mat
.
color
-
new
Color
(
0
,
0
,
0
,
2
)
*
Time
.
deltaTime
);
yield
return
null
;
}
mat
.
SetFloat
(
"_Threshold"
,
1
);
}
}
public
void
Init
()
{
}
public
override
bool
IsHit
(
PlayerInput
input
)
{
return
false
;
}
public
override
void
SetPosition
(
float
remainedTime
)
{
transform
.
position
=
new
Vector3
(
0f
,
-
1.5f
*
Mathf
.
Pow
(
remainedTime
,
2
)
+
1.5f
,
0.4f
);
if
(
Mathf
.
Abs
(
remainedTime
)
<
0.5f
)
foreach
(
var
cat
in
cartridges
)
{
var
pos
=
cat
.
localPosition
;
cat
.
localPosition
=
new
Vector3
(
pos
.
x
,
-
0.25f
*
Mathf
.
Pow
((
remainedTime
-
0.01f
)
*
3
,
4
)
+
1f
,
1f
);
}
if
(
Mathf
.
Abs
(
remainedTime
)
<
0.1f
)
{
foreach
(
var
renderer
in
GetComponentsInChildren
<
MeshRenderer
>()
)
foreach
(
var
cat
in
cartridges
)
{
renderer
.
material
.
color
=
Color
.
Lerp
(
Color
.
white
,
Color
.
red
,
1
-
4
*
Mathf
.
Pow
(
remainedTime
,
2
));
var
renderer
=
cat
.
gameObject
.
GetComponentInChildren
<
MeshRenderer
>();
renderer
.
material
.
color
=
Color
.
Lerp
(
Color
.
white
,
Color
.
red
,
1
-
4
*
Mathf
.
Pow
(
remainedTime
,
3
));
}
}
text
.
position
=
endPoint
+
new
Vector3
(
0
,
0
,
300
)
*
remainedTime
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment