Skip to content

Commit

Permalink
Merge pull request #185 from 2024FALL-SWPP/ref/chaehwan/interface
Browse files Browse the repository at this point in the history
Change interface for anomaly controller
  • Loading branch information
Prown0 authored Dec 5, 2024
2 parents 6fd0bac + 1de388b commit 3cd2c96
Show file tree
Hide file tree
Showing 20 changed files with 135 additions and 116 deletions.
5 changes: 3 additions & 2 deletions 302/Assets/Scenes/DefaultGameScene.unity
Original file line number Diff line number Diff line change
Expand Up @@ -26059,8 +26059,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5f5a6a7b1f18884e843839632af5a6d, type: 3}
m_Name:
m_EditorClassIdentifier:
nameLeft: SlideLeft
nameRight: SlideRight
names:
- SlideLeft
- SlideRight
numSlide: 15
numStage: 8
--- !u!4 &1164630180
Expand Down
17 changes: 10 additions & 7 deletions 302/Assets/Scripts/AbstractAnomalyController.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using UnityEngine;

public abstract class AbstractAnomalyController : AbstractAnomalyObject
public abstract class AbstractAnomalyComposite : AbstractAnomalyObject
{
/**********
* fields *
Expand All @@ -21,7 +21,7 @@ public abstract class AbstractAnomalyController : AbstractAnomalyObject
**************/

// 클래스 이름
public override string Name { get; } = "AbstractAnomalyController";
public override string Name { get; } = "AbstractAnomalyComposite";

/*************************************
* implementation: AbstractBehaviour *
Expand Down Expand Up @@ -143,7 +143,7 @@ protected virtual bool InitObjects()

/* 양식: 복사해서 사용하기.
// `AbstractAnomalyController`는 이상현상 컨트롤러에 관한 추상 클래스입니다.
// `AbstractAnomalyComposite`은 이상현상 개체 묶음에 관한 추상 클래스입니다.
//
// 만약 `AbstractAnomalyObject`를 가지는 오브젝트가 강의실 내에 있다면 이름을 `names`에 넣습니다.
// 만약 `AbstractAnomalyObject`를 가지는 오브젝트가 프리팹으로 돼 있다면 프리팹을 `prefabs`에 넣습니다.
Expand All @@ -152,7 +152,7 @@ protected virtual bool InitObjects()
// `ResetAnomaly`에서는 모든 개체의 `ResetAnomaly`를 호출합니다. (composite pattern이 이미 구현돼 있습니다.)
// 추가적으로 뭘 해야 한다면 오버라이드하면 됩니다.
public class MyClass : AbstractAnomalyController // TODO: 클래스 이름 수정하기.
public class MyClass : AbstractAnomalyComposite // TODO: 클래스 이름 수정하기.
{
// 클래스 이름
public override string Name { get; } = ""; // TODO: 클래스 이름 추가하기.
Expand All @@ -174,6 +174,7 @@ protected override bool InitFields()
bool res = base.InitFields();
// TODO: 필드 초기화할 것 넣기. 없으면 메서드를 아예 지워도 됨.
// (사실 필드 말고 초기화할 것도 넣어도 됨....)
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
Expand All @@ -184,7 +185,8 @@ public override bool StartAnomaly()
{
bool res = base.StartAnomaly();
// TODO: 이상현상 시작하는 코드 넣기. 없으면 메서드를 아예 지워도 됨.
// TODO: 각 개체의 `StartAnomaly`를 호출하는 것 외에 할 게 있으면 추가하기.
// 없으면 메서드를 아예 지워도 됨.
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
Expand All @@ -195,7 +197,8 @@ public override bool ResetAnomaly()
{
bool res = base.ResetAnomaly();
// TODO: 이상현상 초기화하는 코드 넣기. 없으면 메서드를 아예 지워도 됨.
// TODO: 각 개체의 `ResetAnomaly`를 호출하는 것 외에 할 게 있으면 추가하기.
// 없으면 메서드를 아예 지워도 됨.
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
Expand All @@ -206,7 +209,7 @@ protected override bool InitObjects()
{
bool res = base.InitObjects();
// TODO: 앞에서 말한 방식으로 초기화할 수 없는 오브젝트가 있다면 여기서 초기화하기.
// TODO: 주석에서 말한 방식으로 초기화할 수 없는 오브젝트가 있다면 여기서 초기화하기.
// 없으면 메서드를 아예 지워도 됨.
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
Expand Down
1 change: 1 addition & 0 deletions 302/Assets/Scripts/AbstractAnomalyObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ protected override bool InitFields()
bool res = base.InitFields();
// TODO: 필드 초기화할 것 넣기. 없으면 메서드를 아예 지워도 됨.
// (사실 필드 말고 초기화할 것도 넣어도 됨....)
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
Expand Down
41 changes: 41 additions & 0 deletions 302/Assets/Scripts/AbstractBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,47 @@ protected override bool InitFields()
bool res = base.InitFields();
// TODO: 필드 초기화할 것 넣기. 없으면 메서드를 아예 지워도 됨.
// (사실 필드 말고 초기화할 것도 넣어도 됨....)
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
}
} */

/* 추가 양식: 매니저 구현 용 양식
// 싱글턴까지 구현해 놓은 양식입니다.
public class MyManager : AbstractBehaviour // TODO: 클래스 이름 수정하기.
{
// 클래스 이름
public override string Name { get; } = ""; // TODO: 클래스 이름 추가하기.
// 클래스 인스턴스
public static MyManager Instance { get; private set; } // TODO: 클래스 이름 수정하기.
// `Awake` 메시지 용 메서드
protected override bool Awake_()
{
if (Instance == null) {
Log($"`Instance` has not been set => set `Instance` as `{Name}`");
Instance = this;
DontDestroyOnLoad(gameObject);
} else {
Log($"`Instance` has already been set => destroy `{gameObject.name}`");
Destroy(gameObject);
}
return base.Awake_();
}
// 필드를 초기화하는 메서드
protected override bool InitFields()
{
bool res = base.InitFields();
// TODO: 필드 초기화할 것 넣기. 없으면 메서드를 아예 지워도 됨.
// (사실 필드 말고 초기화할 것도 넣어도 됨....)
// 함수가 제대로 작동했으면 `true`를, 아니면 `false`를 반환.
return res;
Expand Down
17 changes: 2 additions & 15 deletions 302/Assets/Scripts/GameManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ private void Start()

// Added by 신 채 환
// 슬라이드 초기화
SlideManager.Instance.GenerateSlideList();
StartCoroutine(InitializeSlideAfterLoad());
SlideManager.Instance.UpdateStage();
}
private void InitializeGame()
{
Expand Down Expand Up @@ -100,10 +99,6 @@ public void Sleep()
// 스테이지 실패 시, 이상현상 리스트를 초기화, 재생성 해야 하므로
// AnomalyManager의 Stage Failure시 작동하는 함수 호출
AnomalyManager.Instance.ResetAnomaliesOnFailure();

// Added by 신 채 환
// 슬라이드 색인 배열 재생성
SlideManager.Instance.GenerateSlideList();
}
currentStageClear = false; // 클리어 상태 초기화
LoadDefaultScene();
Expand All @@ -120,7 +115,7 @@ public void Sleep()

// Added by 신 채 환
// 슬라이드 초기화
StartCoroutine(InitializeSlideAfterLoad());
SlideManager.Instance.UpdateStage();
}
private void LoadDefaultScene()
{
Expand All @@ -142,14 +137,6 @@ private IEnumerator InstantiateAnomalyAfterLoad()
AnomalyManager.Instance.CheckAndInstantiateAnomaly();
}

// Added by 신채환
private IEnumerator InitializeSlideAfterLoad()
{
yield return new WaitForSeconds(0.1f);

SlideManager.Instance.SetSlide(currentStage);
}

private void GameClear()
{
gameState = GameState.GameClear;
Expand Down
121 changes: 43 additions & 78 deletions 302/Assets/Scripts/SlideManager.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Collections.Generic;
using UnityEngine;

public class SlideManager : AbstractBehaviour, IStageObserver
Expand All @@ -7,23 +8,20 @@ public class SlideManager : AbstractBehaviour, IStageObserver
**********/

// 슬라이드 오브젝트 이름
public string nameLeft;
public string nameRight;
public string[] names;

// 개수
public int numSlide;
public int numStage;

// 무작위성
// 난수
private SCH_Random _random;

// 오브젝트
private GameObject _objectLeft;
private GameObject _objectRight;
private List<GameObject> _objects;

// 슬라이드 컨트롤러
private SlideController _controllerLeft;
private SlideController _controllerRight;
private List<SlideController> _controllers;

// 슬라이드 색인 배열
private int[] _slideList;
Expand All @@ -35,7 +33,7 @@ public class SlideManager : AbstractBehaviour, IStageObserver
// 클래스 이름
public override string Name { get; } = "SlideManager";

// 클래스 인자
// 클래스 인스턴스
public static SlideManager Instance { get; private set; }

/**********************************
Expand All @@ -48,28 +46,40 @@ public bool UpdateStage()
bool res = true;

if (stage == 0) {
GenerateSlideList();
// generate random slide index list
_slideList = _random.Combination(numSlide, numStage);
Log($"Generate `_slideList` success: [{string.Join(", ", _slideList)}]");

// find and put away the slides
Log("Call `FindSlides` begin");
if (FindSlides()) {
_objectLeft.transform.Translate(Vector3.down * 100.0f);
_objectRight.transform.Translate(Vector3.down * 100.0f);
Log("Call `FindSlides` success");

foreach (GameObject obj in _objects) {
obj.transform.Translate(Vector3.down * 100.0f);
}

Log("Set slide success: off");
} else {
Log("Set slide failed", mode: 1);
Log("Call `FindSlides` failed", mode: 1);
res = false;
}
} else if (stage > 0 && stage <= numStage) {
// find and update slides
Log("Call `FindSlides` begin");
if (FindSlides()) {
int index = _slideList[stage - 1];
Log("Call `FindSlides` success");

_controllerLeft.Index = index;
_controllerRight.Index = index;
int index = _slideList[stage - 1];

_controllerLeft.ResetSlide();
_controllerRight.ResetSlide();
foreach (SlideController controller in _controllers) {
controller.Index = index;
controller.ResetSlide();
}

Log($"Set slide success: {index}");
} else {
Log("Set slide failed", mode: 1);
Log("Call `FindSlides` failed", mode: 1);
res = false;
}
} else {
Expand Down Expand Up @@ -119,77 +129,32 @@ protected override bool InitFields()
* new methods *
***************/

// 슬라이드 색인 배열을 초기화하는 메서드
public void GenerateSlideList()
{
_slideList = _random.Combination(numSlide, numStage);
Log($"Generate `_slideList` success: [{string.Join(", ", _slideList)}]");
}

// 슬라이드를 초기화하는 메서드
public void SetSlide(int stage)
{
Log("Call `FindSlides` begin");
if (FindSlides()) {
Log("Call `FindSlides` success");
if (stage > 0) {
int index = _slideList[stage - 1];

_controllerLeft.Index = index;
_controllerRight.Index = index;

_controllerLeft.ResetSlide();
_controllerRight.ResetSlide();

Log($"Set slide success: {index}");
} else {
_objectLeft.transform.Translate(Vector3.down * 100.0f);
_objectRight.transform.Translate(Vector3.down * 100.0f);
}
} else {
Log("Call `FindSlides` failed", mode: 1);
}
}

// 슬라이드를 찾는 메서드
private bool FindSlides()
{
bool res = true;

// `_objectLeft` 찾기
_objectLeft = GameObject.Find(nameLeft);
if (_objectLeft != null) {
Log("Find `_objectLeft` success");
for (int idx = 0; idx < names.Length; idx++) {
GameObject obj = GameObject.Find(names[idx]);

// `_controllerLeft` 찾기
_controllerLeft = _objectLeft.GetComponent<SlideController>();
if (_controllerLeft != null) {
Log("Find `_controllerLeft` success");
} else {
Log("Find `_controllerLeft` failed", mode: 1);
res = false;
}
} else {
Log("Find `_objectLeft` failed", mode: 1);
res = false;
}
if (obj != null) {
Log($"Find `{names[idx]}` success: `{obj.name}`");

// `_objectRight` 찾기
_objectRight = GameObject.Find(nameRight);
if (_objectRight != null) {
Log("Find `_objectRight` success");
SlideController controller = obj.GetComponent<SlideController>();

// `_controllerRight` 찾기
_controllerRight = _objectRight.GetComponent<SlideController>();
if (_controllerRight != null) {
Log("Find `_controllerRight` success");
if (controller != null) {
Log($"Find `SlideController` of `{obj.name}` success: `{controller.Name}`");

_objects.Add(obj);
_controllers.Add(controller);
} else {
Log($"Find `SlideController` of `{obj.name}` failed", mode: 1);
res = false;
}
} else {
Log("Find `_controllerRight` failed", mode: 1);
Log($"Find `{names[idx]}` failed", mode: 1);
res = false;
}
} else {
Log("Find `_objectRight` failed", mode: 1);
res = false;
}

return res;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
public class Anomaly18Manager : AbstractAnomalyController
public class Anomaly18Manager : AbstractAnomalyComposite
{
/**************
* properties *
Expand All @@ -16,13 +16,15 @@ protected override bool Awake_()
{
bool res = base.Awake_();

// Code used before `GameManager` updates begin
Log("Call `StartAnomaly` begin");
if (StartAnomaly()) {
Log("Call `StartAnomaly` success");
} else {
Log("Call `StartAnomaly` failed", mode: 1);
res = false;
}
// Code used before `GameManager` updates end

return res;
}
Expand Down
Loading

0 comments on commit 3cd2c96

Please sign in to comment.