Merge branch 'main' into DO-47-승패-무승부-기보씬에-적용

This commit is contained in:
HaeinLEE 2025-03-25 13:49:57 +09:00
commit 5f0d90c2e9
18 changed files with 55191 additions and 20645 deletions

View File

@ -1,10 +1,26 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class GameUIController : MonoBehaviour
{
[SerializeField] private GameObject retryButton;
[SerializeField] private TMP_Text playerANameText;
[SerializeField] private TMP_Text playerBNameText;
[SerializeField] private Image indicatorA;
[SerializeField] private Image indicatorB;
[SerializeField] private Image profileImageA;
[SerializeField] private Image profileImageB;
[SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이
[SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive
private Sprite _originalSpriteA;
private Sprite _originalSpriteB;
public void OnClickConfirmButton()
{
GameManager.Instance.OnClickConfirmButton();
@ -14,4 +30,78 @@ public class GameUIController : MonoBehaviour
{
GameManager.Instance.RetryGame();
}
public void OnClickSurrenderButton()
{
GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () =>
{
//TODO: 서버에 항복 전달 및 기타 등등
GameManager.Instance.ChangeToMainScene();
});
}
public void OnClickSettingsButton()
{
GameManager.Instance.panelManager.OpenSettingsPanel();
}
public void InitUI()
{
if (UserManager.Instance == null) return;
retryButton.SetActive(false);
playerANameText.text = UserManager.Instance.Nickname;
}
public void InitPlayersName(string playerNameA, string playerNameB)
{
playerANameText.text = playerNameA;
playerBNameText.text = playerNameB;
}
public void InitProfileImages(int profileImageIndexA, int profileImageIndexB)
{
profileImageA.sprite = profileImageIndexA == 0 ? profileImageSprites[0] : profileImageSprites[profileImageIndexA];
profileImageB.sprite = profileImageIndexB == 0 ? profileImageSprites[0] : profileImageSprites[profileImageIndexB];
_originalSpriteA = profileImageA.sprite;
_originalSpriteB = profileImageB.sprite;
}
public void SetTurnIndicator(bool isFirstPlayer)
{
if (isFirstPlayer)
{
SetPlayerTurn(profileImageA, _originalSpriteA);
profileImageB.sprite = _originalSpriteB;
indicatorA.sprite = indicatorSprites[0];
indicatorB.sprite = indicatorSprites[1];
}
else
{
SetPlayerTurn(profileImageB, _originalSpriteB);
profileImageA.sprite = _originalSpriteA;
indicatorA.sprite = indicatorSprites[1];
indicatorB.sprite = indicatorSprites[0];
}
}
private void SetPlayerTurn(Image profileImage, Sprite _originalSprite)
{
if (_originalSprite == profileImageSprites[0])
{
profileImage.sprite = profileImageSprites[2];
}
else if (_originalSprite == profileImageSprites[1])
{
profileImage.sprite = profileImageSprites[3];
}
profileImage.transform.DOScale(1.5f, 0.3f).SetEase(Ease.InBack).OnComplete(() =>
{
profileImage.transform.DOScale(1f, 0.3f).SetEase(Ease.OutBack);
});
}
}

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: d652b2a2f29c0c541983b529f66a5169
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: e61de5ff6b71b2e45b0878ccd8c8033a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,818 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 12
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 256
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 1
m_PVRDenoiserTypeDirect: 1
m_PVRDenoiserTypeIndirect: 1
m_PVRDenoiserTypeAO: 1
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 3
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
buildHeightMesh: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &684932257
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 684932260}
- component: {fileID: 684932259}
- component: {fileID: 684932258}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &684932258
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 684932257}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name:
m_EditorClassIdentifier:
m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &684932259
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 684932257}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &684932260
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 684932257}
serializedVersion: 2
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &820078853
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 820078855}
- component: {fileID: 820078854}
m_Layer: 0
m_Name: OmokAI
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &820078854
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 820078853}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 576baa0fe98d40608bf48109ba5ed788, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &820078855
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 820078853}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 540, y: 1760, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1118625357
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1118625358}
- component: {fileID: 1118625360}
- component: {fileID: 1118625359}
m_Layer: 0
m_Name: GameManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1118625358
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1118625357}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 540, y: 1760, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1118625359
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1118625357}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 35a4c6d5d3a97b444b968e68ec8bb9f7, type: 3}
m_Name:
m_EditorClassIdentifier:
panelManagerPrefab: {fileID: 3475740041361426276, guid: 085ca07ca90c92545b2594bd13412701, type: 3}
audioManagerPrefab: {fileID: 2946408323859178723, guid: e829818dce39a5d4383e061111bed871, type: 3}
--- !u!82 &1118625360
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1118625357}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1 &1603784401
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1603784404}
- component: {fileID: 1603784403}
- component: {fileID: 1603784405}
- component: {fileID: 1603784402}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &1603784402
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1603784401}
m_Enabled: 1
--- !u!20 &1603784403
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1603784401}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 14
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &1603784404
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1603784401}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1603784405
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1603784401}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a98355720bed2234fb32d55fc1b0cce6, type: 3}
m_Name:
m_EditorClassIdentifier:
widthUnit: 15
--- !u!1001 &2284388239269102583
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalPosition.y
value: 1.25
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4420653492898845705, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4920236250940775331, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
propertyPath: m_Name
value: omok-board_15x15
objectReference: {fileID: 0}
- target: {fileID: 7155909258766834886, guid: b1a31da84076a534cae7cb20a7913a93, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 37c097f76fd13ca4fafdf2fe352b7f46, type: 3}
--- !u!1001 &2620496338038271331
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 8628819205361144822}
m_Modifications:
- target: {fileID: 3938717138838971436, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_Name
value: GameUIController
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchorMin.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_SizeDelta.x
value: 100
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
--- !u!1 &3802363964775203493
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8628819205361144822}
- component: {fileID: 4321175121778496841}
- component: {fileID: 6859121610019464104}
- component: {fileID: 8945807720517543089}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!223 &4321175121778496841
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802363964775203493}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!1001 &5267987383662235819
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 1162697407390023879, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_Name
value: StoneController
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2953084326724862768, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: ef4aae2728a68064d92cdfc78d599a38, type: 3}
--- !u!114 &6859121610019464104
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802363964775203493}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 1080, y: 1920}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!224 &7932516842477400653 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 5896972595945307833, guid: 0e9e25bc269a21e42b9ef6c91287f2ef, type: 3}
m_PrefabInstance: {fileID: 2620496338038271331}
m_PrefabAsset: {fileID: 0}
--- !u!224 &8628819205361144822
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802363964775203493}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7932516842477400653}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!114 &8945807720517543089
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802363964775203493}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 1603784404}
- {fileID: 8628819205361144822}
- {fileID: 684932260}
- {fileID: 2284388239269102583}
- {fileID: 5267987383662235819}
- {fileID: 1118625358}
- {fileID: 820078855}

54563
Assets/LYC/GameLYC.unity Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c7eedd59cc78a7648a2168fd25540b88
guid: b8e3d5d18e544774eb144db419a327d2
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1713,7 +1713,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\uD14C\uC2A4\uD2B8\uC0BC\uBC88"
m_text: "\uD638\uB7AD\uC774"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2}
m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2}

View File

@ -350,7 +350,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: -392, y: -5.683716}
m_AnchoredPosition: {x: -392, y: -0.86621094}
m_SizeDelta: {x: 784, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &2389273839879143832

View File

@ -120,7 +120,19 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 3806122116930050020}
m_OnClick:
m_PersistentCalls:
m_Calls: []
m_Calls:
- m_Target: {fileID: 3933575647777291622}
m_TargetAssemblyTypeName: GameUIController, Assembly-CSharp
m_MethodName: OnClickSurrenderButton
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1 &626368541760032086
GameObject:
m_ObjectHideFlags: 0
@ -395,6 +407,139 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &1812579611192138725
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3685916492953640732}
- component: {fileID: 2837002930647588383}
- component: {fileID: 7520396528988244836}
- component: {fileID: 4581847833490342559}
m_Layer: 5
m_Name: Settings Button
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3685916492953640732
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1812579611192138725}
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_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2490009981694473494}
m_Father: {fileID: 4044003808430543235}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -50, y: -85}
m_SizeDelta: {x: 238, y: 150}
m_Pivot: {x: 1, y: 1}
--- !u!222 &2837002930647588383
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1812579611192138725}
m_CullTransparentMesh: 1
--- !u!114 &7520396528988244836
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1812579611192138725}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 0.9607844, b: 0.8980393, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 05a670e614d7817429ee256ceb7efbe6, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &4581847833490342559
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1812579611192138725}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 2
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3}
m_PressedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 7520396528988244836}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 3933575647777291622}
m_TargetAssemblyTypeName: GameUIController, Assembly-CSharp
m_MethodName: OnClickSettingsButton
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1 &2180157736785062510
GameObject:
m_ObjectHideFlags: 0
@ -427,6 +572,7 @@ RectTransform:
m_Children:
- {fileID: 4020956126151567600}
- {fileID: 3928015243027423495}
- {fileID: 3685916492953640732}
- {fileID: 5290633878409985}
m_Father: {fileID: 2843270827267453358}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -507,9 +653,9 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: -125}
m_SizeDelta: {x: 250, y: 250}
m_Pivot: {x: 0.5, y: 1}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3001533735177909600
CanvasRenderer:
m_ObjectHideFlags: 0
@ -643,7 +789,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &3928015243027423495
RectTransform:
m_ObjectHideFlags: 0
@ -659,11 +805,11 @@ RectTransform:
- {fileID: 5364152893080087698}
m_Father: {fileID: 4044003808430543235}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -50, y: -85}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 50, y: -85}
m_SizeDelta: {x: 238, y: 150}
m_Pivot: {x: 1, y: 1}
m_Pivot: {x: 0, y: 1}
--- !u!222 &3058652260737614200
CanvasRenderer:
m_ObjectHideFlags: 0
@ -1102,6 +1248,140 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &3803482992194188727
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2490009981694473494}
- component: {fileID: 5753191097148567634}
- component: {fileID: 7418401814114797352}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2490009981694473494
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3803482992194188727}
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3685916492953640732}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 9.0771}
m_SizeDelta: {x: 0, y: -18.1542}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5753191097148567634
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3803482992194188727}
m_CullTransparentMesh: 1
--- !u!114 &7418401814114797352
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3803482992194188727}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\uC124\uC815"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2}
m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4284115536
m_fontColor: {r: 0.3137255, g: 0.4156863, b: 0.3529412, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 45
m_fontSizeBase: 45
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 0
m_fontSizeMax: 0
m_fontStyle: 1
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &3856590192762510114
GameObject:
m_ObjectHideFlags: 0
@ -1611,9 +1891,9 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: -125}
m_SizeDelta: {x: 250, y: 250}
m_Pivot: {x: 0.5, y: 1}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1810525227364227116
CanvasRenderer:
m_ObjectHideFlags: 0
@ -2087,6 +2367,21 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 35a536dce57360441898a57e5d5a1335, type: 3}
m_Name:
m_EditorClassIdentifier:
retryButton: {fileID: 2903228850155334346}
playerANameText: {fileID: 4888719462249568075}
playerBNameText: {fileID: 5649645114775233136}
indicatorA: {fileID: 822440635660578859}
indicatorB: {fileID: 8824651814675414615}
profileImageA: {fileID: 8274101518303565689}
profileImageB: {fileID: 1516328599079970136}
profileImageSprites:
- {fileID: 21300000, guid: 2d325c545f7c9144cb37a45e93e5ddb9, type: 3}
- {fileID: 21300000, guid: 59492a1d9c2719641bd0d4d53988c9b4, type: 3}
- {fileID: 21300000, guid: 0ec0f74f1a2889d418680a98b21a7095, type: 3}
- {fileID: 21300000, guid: 81e6604d6664acf4cab1ff13043e5b54, type: 3}
indicatorSprites:
- {fileID: 21300000, guid: 91965db86e05b144f840b523e83d3816, type: 3}
- {fileID: 21300000, guid: 8379c97a1509fbc42abb3da34d2e647c, type: 3}
--- !u!225 &5999196603484244259
CanvasGroup:
m_ObjectHideFlags: 0

View File

@ -353,7 +353,7 @@ Camera:
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 14
orthographic size: 13.333333
m_Depth: -1
m_CullingMask:
serializedVersion: 2

View File

@ -315,8 +315,8 @@ public static class AIEvaluator
return fourThreeCount;
}
// 깨진 패턴 (3-빈칸-1) 감지
private static (bool isDetected, int count, int openEnds) DetectBrokenPattern(
// 깨진 패턴 (ex. 3-빈칸-1) 감지
public static (bool isDetected, int count, int openEnds) DetectBrokenPattern(
Enums.PlayerType[,] board, int row, int col, int[] dir, Enums.PlayerType player)
{
int size = board.GetLength(0);
@ -403,15 +403,15 @@ public static class AIEvaluator
}
else if (count == 4) // 깨진 4
{
return (openEnds == 2) ? PatternScore.OPEN_FOUR * 0.8f :
(openEnds == 1) ? PatternScore.HALF_OPEN_FOUR * 0.8f :
PatternScore.CLOSED_FOUR * 0.7f;
return (openEnds == 2) ? PatternScore.OPEN_FOUR * 0.9f :
(openEnds == 1) ? PatternScore.HALF_OPEN_FOUR * 0.9f :
PatternScore.CLOSED_FOUR * 0.8f;
}
else if (count == 3) // 깨진 3
{
return (openEnds == 2) ? PatternScore.OPEN_THREE * 0.7f :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE * 0.7f :
PatternScore.CLOSED_THREE * 0.6f;
return (openEnds == 2) ? PatternScore.OPEN_THREE * 0.9f :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE * 0.9f :
PatternScore.CLOSED_THREE * 0.8f;
}
return 0;
@ -443,24 +443,24 @@ public static class AIEvaluator
float normalScore = 0;
if (count >= 4)
{
normalScore = PatternScore.FIVE_IN_A_ROW / 10;
normalScore = PatternScore.FIVE_IN_A_ROW / 9;
}
else if (count == 3)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_THREE / 3 :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE / 5 :
PatternScore.CLOSED_THREE / 5;
normalScore = (openEnds == 2) ? PatternScore.OPEN_THREE / 2.5f :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE / 3.5f :
PatternScore.CLOSED_THREE / 4.5f;
}
else if (count == 2)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_TWO / 2 :
(openEnds == 1) ? PatternScore.HALF_OPEN_TWO / 3 :
PatternScore.CLOSED_TWO / 5;
normalScore = (openEnds == 2) ? PatternScore.OPEN_TWO / 3.0f :
(openEnds == 1) ? PatternScore.HALF_OPEN_TWO / 4.0f :
PatternScore.CLOSED_TWO / 5.0f;
}
else if (count == 1)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_ONE :
PatternScore.CLOSED_ONE;
normalScore = (openEnds == 2) ? PatternScore.OPEN_ONE / 4.0f :
PatternScore.CLOSED_ONE / 5.0f;
}
// 깨진 패턴 평가
@ -469,7 +469,7 @@ public static class AIEvaluator
if (isBroken)
{
brokenScore = EvaluateBrokenPattern(brokenCount, brokenOpenEnds);
brokenScore = EvaluateBrokenPattern(brokenCount, brokenOpenEnds) * 1.5f;
}
directionScore = Math.Max(normalScore, brokenScore);
@ -491,27 +491,28 @@ public static class AIEvaluator
opponentPatterns.Add((dir, count, openEnds));
float normalScore = 0;
// 상대 패턴 차단에 대한 가치 (약간 낮은 가중치) AI는 공격지향적으로
if (count >= 4)
{
normalScore = PatternScore.FIVE_IN_A_ROW / 12.5f;
normalScore = PatternScore.FIVE_IN_A_ROW / 8.5f;
}
else if (count == 3)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_THREE / 3.75f :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE / 6.25f :
PatternScore.CLOSED_THREE / 6.25f;
// 일관된 분모 사용 (방어 가중치는 유지)
normalScore = (openEnds == 2) ? PatternScore.OPEN_THREE / 1.3f :
(openEnds == 1) ? PatternScore.HALF_OPEN_THREE / 3.2f :
PatternScore.CLOSED_THREE / 4.2f;
}
else if (count == 2)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_TWO / 2.5f :
(openEnds == 1) ? PatternScore.HALF_OPEN_TWO / 3.75f :
PatternScore.CLOSED_TWO / 5f;
normalScore = (openEnds == 2) ? PatternScore.OPEN_TWO / 2.7f :
(openEnds == 1) ? PatternScore.HALF_OPEN_TWO / 3.7f :
PatternScore.CLOSED_TWO / 4.7f;
}
else if (count == 1)
{
normalScore = (openEnds == 2) ? PatternScore.OPEN_ONE / 1.25f :
PatternScore.CLOSED_ONE;
normalScore = (openEnds == 2) ? PatternScore.OPEN_ONE / 3.7f :
PatternScore.CLOSED_ONE / 4.7f;
}
var (isBroken, brokenCount, brokenOpenEnds) = DetectBrokenPattern(board, row, col, dir, opponentPlayer);
@ -520,7 +521,7 @@ public static class AIEvaluator
if (isBroken)
{
// 깨진 패턴은 일반 패턴보다 좀 더 높은 가중치 할당
brokenScore = EvaluateBrokenPattern(brokenCount, brokenOpenEnds) * 0.9f;
brokenScore = EvaluateBrokenPattern(brokenCount, brokenOpenEnds) * 1.2f;
}
directionScore = Math.Max(normalScore, brokenScore);
@ -561,7 +562,7 @@ public static class AIEvaluator
if (!AreParallelDirections(openThrees[i].dir, openThrees[j].dir))
{
float threeThreeScore = PatternScore.DOUBLE_THREE / 4; // 복합 패턴 가중치
score += isAI ? threeThreeScore : threeThreeScore * 1.1f;
score += isAI ? threeThreeScore * 1.1f : threeThreeScore * 1.3f;
break;
}
}
@ -578,7 +579,7 @@ public static class AIEvaluator
if (!AreParallelDirections(fours[i].dir, fours[j].dir))
{
float fourFourScore = PatternScore.DOUBLE_FOUR / 4;
score += isAI ? fourFourScore : fourFourScore * 1.2f;
score += isAI ? fourFourScore * 1.2f : fourFourScore * 1.5f;
break;
}
}
@ -589,7 +590,7 @@ public static class AIEvaluator
if (fours.Count > 0 && openThrees.Count > 0)
{
float fourThreeScore = PatternScore.FOUR_THREE / 4;
score += isAI ? fourThreeScore : fourThreeScore * 1.2f;
score += isAI ? fourThreeScore * 1.1f : fourThreeScore * 1.4f;
}
return score;

View File

@ -10,12 +10,16 @@ public static class MiniMaxAIController
private static int[][] _directions = AIConstants.Directions;
private static int _playerLevel = 1; // 급수 설정
private static float _mistakeMove;
private static int _playerRating = 18; // 급수. 기본값 18(최하)
private static Enums.PlayerType _AIPlayerType = Enums.PlayerType.PlayerB;
private static System.Random _random = new System.Random(); // 랜덤 실수용 Random 함수
// 실수 관련 변수
private static float _baselineMistakeProb; // 기본 실수 확률
private static float _mistakeSeverity; // 실수의 심각도 (높을수록 더 나쁜 수를 둘 확률 증가)
private static int _consecutiveGoodMoves = 0; // 연속으로 좋은 수를 둔 횟수
private static int _turnsPlayed = 0; // 진행된 턴 수
private static System.Random _random = new System.Random();
// 중복 계산을 방지하기 위한 캐싱 데이터. 위치 기반 (그리드 기반 해시맵)
private static Dictionary<(int row, int col), Dictionary<(int dirX, int dirY), (int count, int openEnds)>>
@ -28,18 +32,17 @@ public static class MiniMaxAIController
}
// 급수 설정 -> 실수 넣을 때 계산
public static void SetLevel(int level)
public static void SetRating(int level)
{
_playerLevel = level;
// 레벨에 따른 실수율? 설정
_mistakeMove = GetMistakeProbability(_playerLevel);
_playerRating = level;
GetMistakeProbability(_playerRating);
}
// 실수 확률 계산 함수
private static float GetMistakeProbability(int level)
private static void GetMistakeProbability(int level)
{
// 레벨이 1일 때 실수 확률 0%, 레벨이 18일 때 실수 확률 50%
return (level - 1) / 17f * 0.5f;
_baselineMistakeProb = Math.Max(0.01f, (level - 1) / 17f * 0.34f); //1급 1%, 18급 35%
_mistakeSeverity = 1f - ((level - 1) / 17f); // 레벨이 낮을수록 심각한 실수를 함
}
// return 값이 null 일 경우 == 보드에 칸 꽉 참
@ -50,7 +53,7 @@ public static class MiniMaxAIController
float bestScore = float.MinValue;
(int row, int col)? bestMove = null;
(int row, int col)? secondBestMove = null;
List<(int row, int col)>? fiveInARowMoves = null;
List<(int row, int col, float score)> validMoves = GetValidMoves(board);
// 보드에 놓을 수 있는 자리가 있는지 확인
@ -59,11 +62,22 @@ public static class MiniMaxAIController
return null;
}
// 5연승 가능한 자리를 먼저 찾아서 우선적으로 설정
List<(int row, int col)> fiveInARowMoves = GetFiveInARowCandidateMoves(board);
if (fiveInARowMoves.Count > 0)
// 즉시 승리 가능한 자리를 먼저 찾아서 우선적으로 설정
fiveInARowMoves = GetFiveInARowCandidateMoves(board, _AIPlayerType);
if (fiveInARowMoves != null & fiveInARowMoves.Count > 0)
{
bestMove = fiveInARowMoves[0];
_turnsPlayed++;
return bestMove;
}
// 즉시 패배 가능한 자리를 먼저 찾아서 우선적으로 설정
// var oppositePlayer = _AIPlayerType == Enums.PlayerType.PlayerB ? Enums.PlayerType.PlayerA : Enums.PlayerType.PlayerB;
fiveInARowMoves = GetFiveInARowCandidateMoves(board, Enums.PlayerType.PlayerA);
if (fiveInARowMoves != null & fiveInARowMoves.Count > 0)
{
bestMove = fiveInARowMoves[0];
_turnsPlayed++;
return bestMove;
}
@ -76,26 +90,82 @@ public static class MiniMaxAIController
if (score > bestScore)
{
bestScore = score;
if (bestMove != null)
{
secondBestMove = bestMove;
}
bestMove = (row, col);
}
}
// 랜덤 실수
if (secondBestMove != null && _random.NextDouble() < _mistakeMove)
float currentMistakeProb = CalculateDynamicMistakeProb(board, validMoves); // 실수 확률 동적 조정
// 실수 확률에 따라 실수 여부 결정
if (_random.NextDouble() < currentMistakeProb)
{
Debug.Log("AI Mistake");
return secondBestMove;
}
int moveIndex = SelectMistakeMove(validMoves);
_consecutiveGoodMoves = 0; // 실수했으므로 연속 카운터 리셋
var mistakeMove = (validMoves[moveIndex].row, validMoves[moveIndex].col);
// Debug.Log($"AI Mistake: 최적 점수 {validMoves[0].score}대신 {validMoves[moveIndex].score} 선택 (실수 확률: {currentMistakeProb:P2})");
_turnsPlayed++;
return mistakeMove;
}
// 실수X
_consecutiveGoodMoves++;
_turnsPlayed++;
return bestMove;
}
#region Mistake Code
// 동적 실수 확률 계산 (게임 상황에 따라 조정)
private static float CalculateDynamicMistakeProb(Enums.PlayerType[,] board, List<(int row, int col, float score)> validMoves)
{
float mistakeProb = _baselineMistakeProb;
// 1. 턴 수에 따라 조정
if (_turnsPlayed < 5) // 초반에는 실수 확률 감소
{
mistakeProb *= 0.5f;
}
// 2. 연속적인 좋은 수에 따른 조정 (집중력 저하 효과)
if (_consecutiveGoodMoves > 3)
{
// 연속으로 좋은 수를 두면 집중력이 저하되어 실수 확률 증가
mistakeProb += (_consecutiveGoodMoves - 3) * 0.03f;
}
// 3. 게임 후반 집중력 향상 (마지막 몇 수는 집중)
if (_turnsPlayed > 78) {
mistakeProb *= 0.7f; // 종반에는 더 집중
}
return Math.Min(mistakeProb, 0.8f); // 최대 80%로 제한
}
// 실수 선택(경미 ~ 심각)
private static int SelectMistakeMove(List<(int row, int col, float score)> moves)
{
int moveCount = moves.Count;
// _mistakeSeverity가 높을수록(레벨이 낮을수록) 더 심각한 실수를 할 확률 증가
float severityFactor = (float)Math.Pow(_random.NextDouble(), 1 / _mistakeSeverity);
// 상위 수들 중에서는 약간 안 좋은 수를, 하위 수들 중에서는 매우 안 좋은 수를 선택
int mistakeIndex = Math.Min(1 + (int)(severityFactor * (moveCount - 1)), moveCount - 1);
// 가끔 완전히 랜덤한 수 선택 (매우 낮은 확률)
if (_random.NextDouble() < 0.05 * _mistakeSeverity)
{
mistakeIndex = _random.Next(1, moveCount);
}
return mistakeIndex;
}
#endregion
private static float DoMinimax(Enums.PlayerType[,] board, int depth, bool isMaximizing, float alpha, float beta,
int recentRow, int recentCol)
{
@ -136,6 +206,8 @@ public static class MiniMaxAIController
private static List<(int row, int col, float score)> GetValidMoves(Enums.PlayerType[,] board)
{
List<(int, int, float)> validMoves = new List<(int, int, float)>();
List<(int, int, float)> allMoves = new List<(int, int, float)>();
int size = board.GetLength(0);
for (int row = 0; row < size; row++)
@ -146,16 +218,26 @@ public static class MiniMaxAIController
{
// 보드 전체가 아닌 해당 돌에 대해서만 Score 계산
float score = AIEvaluator.EvaluateMove(board, row, col, _AIPlayerType);
validMoves.Add((row, col, score));
allMoves.Add((row, col, score));
}
}
}
// score가 높은 순으로 정렬 -> 더 좋은 수 먼저 계산하도록 함
validMoves.Sort((a, b) => b.Item3.CompareTo(a.Item3));
// 시간 단축을 위해 상위 10-15개만 고려.
return validMoves.Take(10).ToList();
allMoves.Sort((a, b) => b.Item3.CompareTo(a.Item3));
int topCount = Math.Min(8, allMoves.Count); // 상위 8개 (또는 가능한 최대)
validMoves.AddRange(allMoves.Take(topCount));
// 중간 범위의 점수를 가진 수도 일부 포함 (전략적 게임을 위해서)
if (allMoves.Count > topCount + 10) // 10개 이상의 후보가 있을 때만
{
var middleIndex = allMoves.Count / 2;
var middleMoves = allMoves.Skip(middleIndex - 1).Take(2); // 중간 부분에서 2개 선택
validMoves.AddRange(middleMoves);
}
return validMoves;
}
private static bool HasNearbyStones(Enums.PlayerType[,] board, int row, int col, int distance = 3)
@ -286,7 +368,7 @@ public static class MiniMaxAIController
}
// 5목이 될 수 있는 위치 찾기
private static List<(int row, int col)> GetFiveInARowCandidateMoves(Enums.PlayerType[,] board)
private static List<(int row, int col)> GetFiveInARowCandidateMoves(Enums.PlayerType[,] board, Enums.PlayerType currentPlayer)
{
List<(int row, int col)> fiveInARowMoves = new List<(int, int)>();
int size = board.GetLength(0);
@ -299,12 +381,21 @@ public static class MiniMaxAIController
foreach (var dir in _directions)
{
var (count, openEnds) = CountStones(board, row, col, dir, _AIPlayerType);
var (count, openEnds) = CountStones(board, row, col, dir, currentPlayer, false);
if (count == 4 && openEnds > 0)
if (count + 1 == WIN_COUNT && openEnds > 0) // 일반 패턴 (연속 4돌)
{
fiveInARowMoves.Add((row, col));
break; // 하나 나오면 바로 break (시간 단축)
return new List<(int row, int col)> { (row, col) }; // 하나 나오면 바로 return (시간 단축)
}
if (count >= 2) // 깨진 패턴 평가
{
var (isBroken, brokenCount, _) = AIEvaluator.DetectBrokenPattern(board, row, col, dir, currentPlayer);
if (isBroken && brokenCount + 1 >= WIN_COUNT) // 자기 자신 포함
{
return new List<(int row, int col)> { (row, col) };
}
}
}
}

View File

@ -1,8 +1,8 @@
using System;
using UnityEngine;
using System.Threading.Tasks;
using UnityEngine.SceneManagement;
public class OmokAI : MonoBehaviour
public class OmokAI : Singleton<OmokAI>
{
public static OmokAI Instance;
@ -10,6 +10,17 @@ public class OmokAI : MonoBehaviour
{
Instance = this;
}
// AI가 Player B가 아닌 경우 해당 메서드로 설정. 기본값은 PlayerB
public void SetAIPlayerType(Enums.PlayerType AIPlayerType)
{
MiniMaxAIController.SetAIPlayerType(AIPlayerType);
}
public void SetRating(int level)
{
MiniMaxAIController.SetRating(level);
}
public async void StartBestMoveSearch(Enums.PlayerType[,] board, Action<(int, int)?> callback)
{
@ -23,4 +34,6 @@ public class OmokAI : MonoBehaviour
bool isWin = MiniMaxAIController.CheckGameWin(player, board, row, col, false);
return isWin;
}
protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode) { }
}

View File

@ -122,6 +122,7 @@ public class CoinsPanelController : MonoBehaviour
}
sequence.OnComplete(() =>
{
_coinsCount += coinsCount; //추가된 코인 적용
_canvasGroup.blocksRaycasts = true; //구매 후 클릭 활성화
});
}
@ -162,8 +163,9 @@ public class CoinsPanelController : MonoBehaviour
coinsRemoveImageObject.GetComponent<Image>().DOFade(0f, 1f)
.OnComplete( ()=>ChangeTextAnimation(false, ()=>
{
// TODO: 코인 수량 감소
// GameManager.Instance.CoinsCount--;
//감소된 코인 적용
_coinsCount -= 100;
action?.Invoke();
})); // 텍스트 떨어지는 연출
}

View File

@ -184,14 +184,6 @@ public class GameLogic : MonoBehaviour
private List<Vector2Int> _forbiddenMoves = new List<Vector2Int>();
#endregion
private static int[][] _directions = new int[][]
{
new int[] {1, 0}, // 수직
new int[] {0, 1}, // 수평
new int[] {1, 1}, // 대각선 ↘ ↖
new int[] {1, -1} // 대각선 ↙ ↗
};
public GameLogic(StoneController stoneController, Enums.GameType gameType, FioTimer fioTimer = null)
{
//보드 초기화
@ -233,18 +225,25 @@ public class GameLogic : MonoBehaviour
};
}
//TODO: 기보 매니저에게 플레이어 닉네임 넘겨주기, 프로필정보도 넘겨줘야 합니다.
ReplayManager.Instance.InitReplayData("PlayerA","nicknameB");
switch (gameType)
{
case Enums.GameType.SinglePlay:
firstPlayerState = new PlayerState(true);
secondPlayerState = new AIState();
// AI 난이도 설정(급수 설정)
OmokAI.Instance.SetRating(UserManager.Instance.Rating);
//유저 이름 사진 초기화
GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, "AIPlayer");
GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, 1);
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"PlayerAI", UserManager.Instance.imageIndex, 1);
SetState(firstPlayerState);
break;
case Enums.GameType.MultiPlay:
//TODO: 멀티 구현 필요
ReplayManager.Instance.InitReplayData("PlayerA","nicknameB");
break;
case Enums.GameType.Replay:
//TODO: 리플레이 구현
@ -273,6 +272,8 @@ public class GameLogic : MonoBehaviour
_currentPlayerState?.OnExit(this);
_currentPlayerState = state;
_currentPlayerState?.OnEnter(this);
//턴 표시
GameManager.Instance.SetTurnIndicator(_currentPlayerState == firstPlayerState);
}
//스톤의 상태변경 명령함수
@ -358,17 +359,9 @@ public class GameLogic : MonoBehaviour
//승리 확인 함수
public bool CheckGameWin(Enums.PlayerType player, int row, int col)
{
foreach (var dir in _directions)
{
var (count, _) = CountStones(_board, row, col, dir, player);
// 자기 자신 포함하여 5개 이상일 시 true 반환
if (count + 1 >= Constants.WIN_COUNT)
return true;
}
return false;
return OmokAI.Instance.CheckGameWin(player, _board, row, col);
}
// 특정 방향으로 같은 돌 개수와 열린 끝 개수를 계산하는 함수
private (int count, int openEnds) CountStones(
Enums.PlayerType[,] board, int row, int col, int[] direction, Enums.PlayerType player)
@ -433,7 +426,7 @@ public class GameLogic : MonoBehaviour
{
if (tempBoard[row, col] != Enums.PlayerType.None) continue;
tempBoard[row, col] = player;
foreach (var dir in _directions)
foreach (var dir in AIConstants.Directions)
{
var (count, _) = CountStones(tempBoard, row, col, dir, player);

View File

@ -4,12 +4,15 @@ using UnityEngine.SceneManagement;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using DG.Tweening;
public class GameManager : Singleton<GameManager>
{
private Enums.GameType _gameType;
private GameLogic _gameLogic;
private StoneController _stoneController;
private GameObject _omokBoardImage;
private GameUIController _gameUIController;
[SerializeField] private GameObject panelManagerPrefab;
[SerializeField] private GameObject audioManagerPrefab;
@ -22,19 +25,6 @@ public class GameManager : Singleton<GameManager>
base.Awake();
InitPanels();
}
private void Start()
{
//게임 씬에서 확인하기 위한 임시 코드
_gameType = Enums.GameType.SinglePlay;
//게임 씬에서 확인하기 위한 임시 코드
// _canvas = canvas.GetComponent<Canvas>();
// _stoneController = GameObject.FindObjectOfType<StoneController>();
// _stoneController.InitStones();
// var fioTimer = FindObjectOfType<FioTimer>();
// _gameLogic = new GameLogic(_stoneController, _gameType, fioTimer);
}
private void InitPanels()
{
@ -56,7 +46,11 @@ public class GameManager : Singleton<GameManager>
}
else
{
//TODO: 착수할 위치를 선택하라는 동작
if (_stoneController != null && _omokBoardImage != null)
{
_stoneController.GetComponent<Transform>().DOShakePosition(0.5f, 0.5f);
_omokBoardImage.GetComponent<Transform>().DOShakePosition(0.5f, 0.5f);
}
}
}
@ -66,18 +60,23 @@ public class GameManager : Singleton<GameManager>
SceneManager.LoadScene("Game");
}
public void ChangeToMainScene()
{
_gameType = Enums.GameType.None;
SceneManager.LoadScene("Main");
}
protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == "Game")
{
if (_gameType == Enums.GameType.Replay)
{
//TODO: 리플레이를 위한 초기화
}
_stoneController = GameObject.FindObjectOfType<StoneController>();
_stoneController.InitStones();
var fioTimer = FindObjectOfType<FioTimer>();
_omokBoardImage = GameObject.FindObjectOfType<SpriteRenderer>().gameObject;
_gameUIController = GameObject.FindObjectOfType<GameUIController>();
_gameLogic = new GameLogic(_stoneController, _gameType, fioTimer);
}
InitPanels();
}
@ -88,5 +87,22 @@ public class GameManager : Singleton<GameManager>
_stoneController.InitStones();
_gameLogic.SetState(_gameLogic.firstPlayerState);
}
//유저 이름 Game UI에 초기화
public void InitPlayersName(string playerNameA, string playerNameB)
{
if (_gameUIController == null) return;
_gameUIController.InitPlayersName(playerNameA, playerNameB);
}
//유저 프로필 이미지 Game UI에 초기화
public void InitProfileImages(int profileImageIndexA, int profileImageIndexB)
{
if (_gameUIController == null) return;
_gameUIController.InitProfileImages(profileImageIndexA, profileImageIndexB);
}
public void SetTurnIndicator(bool isFirstPlayer)
{
if (_gameUIController == null) return;
_gameUIController.SetTurnIndicator(isFirstPlayer);
}
}

View File

@ -14,4 +14,7 @@ EditorBuildSettings:
- enabled: 1
path: Assets/Scenes/Replay.unity
guid: 393dbf55b04641847ae9b882a54856af
- enabled: 1
path: Assets/LYC/GameLYC.unity
guid: 2fe8a02a96ca80b4493a6885b1edffc2
m_configObjects: {}