Compare commits

...

5 Commits

Author SHA1 Message Date
b5a39714f0 Merge pull request 'DEG-116-액션과-컷씬-연동-재작업' (#2) from DEG-116-액션과-컷씬-연동-재작업 into main
Reviewed-on: #2
Reviewed-by: Sehyeon <sehyeon1837@gmail.com>
Reviewed-by: fiore <cjsdlf44@gmail.com>
2025-04-29 01:45:02 +00:00
HaeinLEE
e1c1f6a329 [Fix] 폰트 재설치 2025-04-29 10:43:41 +09:00
HaeinLEE
406dc8f84f [Style] 개인 프리팹 정리 2025-04-28 21:36:38 +09:00
HaeinLEE
c262b9e2f7 [Feat] 컷씬 자동 꺼짐 기능 2025-04-28 21:24:43 +09:00
HaeinLEE
cdded898ec [Feat] 기존 커밋 복구 2025-04-28 17:44:00 +09:00
34 changed files with 279685 additions and 1290 deletions

13
.idea/.idea.Degulleo3D116Rework/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,13 @@
# 디폴트 무시된 파일
/shelf/
/workspace.xml
# Rider에서 무시된 파일
/contentModel.xml
/projectSettingsUpdater.xml
/modules.xml
/.idea.Degulleo3D116Rework.iml
# 에디터 기반 HTTP 클라이언트 요청
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

BIN
Assets/LIN/Housing Copy.unity (Stored with Git LFS)

Binary file not shown.

BIN
Assets/LIN/Prefabs/Canvas.prefab (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,7 @@
fileFormatVersion: 2
guid: 5b14d6aa88de82f449e47d835ebf73c7
PrefabImporter:
guid: 94531ff12d388974a9a50a9e33997d6e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:

View File

@ -12,6 +12,7 @@ public class InteractionController : MonoBehaviour
[FormerlySerializedAs("housingCanvasManager")]
[Header("UI 연동")]
[SerializeField] HousingCanvasController housingCanvasController;
[SerializeField] private InteractionAnimationPanelController interactionAnimationPanelController;
private SuddenEventController _suddenEventController = new SuddenEventController();
@ -38,6 +39,7 @@ public class InteractionController : MonoBehaviour
if (interactionLayerMask == (interactionLayerMask | (1 << other.gameObject.layer)))
{
housingCanvasController.HideInteractionButton();
housingCanvasController.interactionTextsController.InitInteractionTexts();
}
}
@ -51,11 +53,12 @@ public class InteractionController : MonoBehaviour
if (playerStats.CanPerformByHealth(interactionType))
{
playerStats.PerformAction(interactionType);
interactionAnimationPanelController.ShowAnimationPanel(interactionType,interactionTexts.AnimationText);
}
else
{
housingCanvasController.SetActionText(interactionTexts.LackOfHealth);
housingCanvasController.SetDescriptionText();
housingCanvasController.interactionTextsController.ActiveTexts(interactionTexts.LackOfHealth);
}
});
}

View File

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

View File

@ -3,14 +3,14 @@ using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class HousingCanvasController : MonoBehaviour
{
[Header("일상행동 상호작용")]
[SerializeField] GameObject interactionButton;
[SerializeField] TMP_Text actionText;
[SerializeField] TMP_Text descriptionText;
[SerializeField] private GameObject interactionButton;
public InteractionTextsContoller interactionTextsController;
[Header("돌발 이벤트")]
[SerializeField] private GameObject suddenPanel;
[SerializeField] private TMP_Text suddenText;
@ -20,34 +20,16 @@ public class HousingCanvasController : MonoBehaviour
void Awake()
{
InitInteractionTexts();
interactionTextsController.InitInteractionTexts();
interactionButton.SetActive(false);
suddenPanel.SetActive(false);
}
#region
//사물 이름 세팅
public void SetActionText(string text = "")
{
actionText.text = text;
}
//사물 상호작용 내용 설명
public void SetDescriptionText(string text = "")
{
descriptionText.text = text;
}
private void InitInteractionTexts()
{
SetActionText();
SetDescriptionText();
}
// 상호작용 가능한 사물에 가까이 갔을 때 화면에 텍스트, 버튼 표시
public void ShowInteractionButton(string actText, string descText,Action onInteractionButtonPressed)
{
SetActionText(actText);
SetDescriptionText(descText);
interactionTextsController.ActiveTexts(actText, descText);
interactionButton.SetActive(true);
//각 행동 별로 실행되어야 할 이벤트 구독
@ -56,8 +38,6 @@ public class HousingCanvasController : MonoBehaviour
//범위에서 벗어나면 상호작용 버튼 off
public void HideInteractionButton()
{
SetActionText();
SetDescriptionText();
interactionButton.SetActive(false);
//구독해놓은 이벤트 해제
@ -67,8 +47,13 @@ public class HousingCanvasController : MonoBehaviour
//상호작용 버튼 눌렀을 때
public void OnClickInteractionButton()
{
//상호작용 별 행동 수행
OnInteractionButtonPressed?.Invoke();
OnInteractionButtonPressed = null;
//상호작용 버튼과 텍스트 숨김
HideInteractionButton();
interactionTextsController.InitInteractionTexts();
}
#endregion

View File

@ -20,10 +20,15 @@ public static class HousingConstants
public static readonly Dictionary<ActionType, InteractionTexts> interactions =
new Dictionary<ActionType, InteractionTexts>
{
{ ActionType.Sleep, new InteractionTexts("침대에서 잘까?","숙면으로 시간 당 체력 1을 회복한다.", ".")},
{ ActionType.Housework, new InteractionTexts("밀린 집안일을 처리할까?","체력 1을 사용하고 좋은일이 일어날지도 모른다","힘들어서 못해..")},
{ ActionType.Dungeon, new InteractionTexts("던전에 입장할까?","체력 3을 사용하고 3시간이 흐른다.","던전에 갈 체력이 되지 않아..")},
{ ActionType.Work, new InteractionTexts("출근한다.","체력 3을 사용하고 저녁 6시에나 돌아오겠지..", "도저히 출근할 체력이 안되는걸..?")}
{ ActionType.Sleep, new InteractionTexts("침대에서 잘까?","숙면으로 시간 당 체력 1을 회복한다.",
".","쿨쿨 자는 중")},
{ ActionType.Housework, new InteractionTexts("밀린 집안일을 처리할까?","체력 1을 사용하고 좋은일이 일어날지도 모른다",
"힘들어서 못해..","세탁하는 중")},
{ ActionType.Dungeon, new InteractionTexts("던전에 입장할까?","체력 3을 사용하고 3시간이 흐른다.",
"던전에 갈 체력이 되지 않아..","던전 진입하는 중")},
{ ActionType.Work, new InteractionTexts("출근한다.","체력 3을 사용하고 저녁 6시에나 돌아오겠지..",
"도저히 출근할 체력이 안되는걸..?","출근하는 중")},
{ActionType.Eat, new InteractionTexts("식사를 하자","1시간 동안 체력 1을 회복한다.","밥 먹는 중")}
};
#endregion
@ -32,12 +37,14 @@ public static class HousingConstants
public string ActionText { get; private set; }
public string DescriptionText { get; private set; }
public string LackOfHealth { get; private set; }
public string AnimationText { get; private set; }
public InteractionTexts(string actionText, string descriptionText, string lackOfHealth)
public InteractionTexts(string actionText, string descriptionText, string lackOfHealth, string animationText = "")
{
ActionText = actionText;
DescriptionText = descriptionText;
LackOfHealth = lackOfHealth;
AnimationText = animationText;
}
}
}

View File

@ -0,0 +1,106 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class InteractionAnimationPanelController : MonoBehaviour
{
[SerializeField] private GameObject panel;
[SerializeField] private Image doingImage;
[SerializeField] private TMP_Text doingText;
[SerializeField] private Animator animator;
[SerializeField] private float animationDuration = 2.0f;
private Coroutine _textAnimCoroutine;
private Coroutine _autoHideCoroutine;
public void SetDoingText(string text)
{
doingText.text = text;
}
public void ShowAnimationPanel(ActionType actionType, string animationText)
{
// 1) 패널 활성화
panel.SetActive(true);
// 2) 기존 코루틴 정리
if (_textAnimCoroutine != null) StopCoroutine(_textAnimCoroutine);
if (_autoHideCoroutine != null) StopCoroutine(_autoHideCoroutine);
// 3) 텍스트 및 애니메이션 세팅
doingText.text = animationText;
switch (actionType)
{
case ActionType.Sleep:
break;
case ActionType.Work:
break;
case ActionType.Eat:
break;
case ActionType.Dungeon:
break;
case ActionType.Housework:
animator.Play("Laundry");
break;
}
_textAnimCoroutine = StartCoroutine(TextDotsAnimation());
_autoHideCoroutine = StartCoroutine(AutoHidePanel());
}
private IEnumerator TextDotsAnimation()
{
var tempText = doingText.text;
float startTime = Time.time;
while (Time.time - startTime < 3)
{
for (int i = 0; i < 3; i++)
{
yield return new WaitForSeconds(0.3f);
doingText.text = tempText + new string('.', i + 1);
}
yield return new WaitForSeconds(0.3f);
}
}
/// <summary>
/// 패널이 2초후 자동으로 닫히거나 터치시 닫히도록 합니다.
/// </summary>
/// <returns></returns>
private IEnumerator AutoHidePanel()
{
float startTime = Time.time;
while (Time.time - startTime < animationDuration)
{
if (Input.touchCount > 0 || Input.GetMouseButtonDown(0))
{
break;
}
yield return null;
}
//패널 닫고 애니메이션 null처리
HidePanel();
_autoHideCoroutine = null;
}
private void HidePanel()
{
panel.SetActive(false);
if (_textAnimCoroutine != null)
{
StopCoroutine(_textAnimCoroutine);
_textAnimCoroutine = null;
}
if (_autoHideCoroutine != null)
{
StopCoroutine(_autoHideCoroutine);
_autoHideCoroutine = null;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a67d1bf02c4a3d34cb1b9709d9930fa1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,41 @@
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class InteractionTextsContoller : MonoBehaviour
{
[SerializeField] private GameObject textsPanel;
[SerializeField] TMP_Text actionText;
[SerializeField] TMP_Text _descriptionText;
public void SetActionText(string text)
{
actionText.text = text;
}
/// <summary>
/// Panel 활성화를 끄고 텍스트들을 초기화 합니다.
/// </summary>
public void InitInteractionTexts()
{
textsPanel.SetActive(false);
SetActionText("");
_descriptionText.text = "";
}
/// <summary>
/// 특정 범위 안에 상호작용 물체가 들어왔을 때, 상호작용 텍스트 패널을 활성화시킴
/// </summary>
/// <param name="actionText">상호작용할 내용</param>
/// <param name="_descriptionText">스테이터스 변경에 대한 설명</param>
public void ActiveTexts(string actionText, string descriptionText = "")
{
SetActionText(actionText);
_descriptionText.text = descriptionText;
textsPanel.SetActive(true);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1a9631c7b5512cc4ab41bbca8c17b945
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 80e8f592861964445a697bb8c8fee37d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long