Ssssong += Dev

[퍼즐게임] WHITE POLYGON - 7 본문

개발/WHITE POLYGON

[퍼즐게임] WHITE POLYGON - 7

ssong_dev 2022. 7. 28. 21:12

7/26일자 기록이다.

Octahedron 스테이지의 기본 이동 방식을 세팅하였다.

TrainMove 스크립트를 통해 목표 지점에 도달 시 회전이 가능한 지 여부를 확인하고

끝까지 갔을 때 Collider로 검사하여 다음 기차로 교체하여 진행한다.

public override void Start()
    {
        base.Start();
        initCanNextTrain = canNextTrain;

        ResetInitState();
    }


    public override void Update()
    {
        if(nowMove)
        {
            gameObject.transform.position = Vector3.MoveTowards(gameObject.transform.position, nowDestination.position, moveSpeed);

            if (Mathf.Abs((gameObject.transform.position - nowDestination.position).magnitude) < 0.05f)
            {
                //목표지점 도착 후 회전 가능, 움직이지 않음 상태로 변경
                canRotate = true;
                nowMove = false;

                //중간지점에 왔을 때, 자동회전이 온 되어있으면 회전 시작
                if (stopPos != null && autoRotate && nowDestination.gameObject.name == stopPos.gameObject.name)
                {
                    roadRotate.rotateStart = true;
                }

                //도착 시 위치 및 회전값 초기화
                if (destPos != null && nowDestination.gameObject.name == destPos.gameObject.name)
                {
                    ResetInitState();

                    if (destHide)
                    {
                        gameObject.SetActive(false);
                    }  
                }
            }
            else
            {
                canRotate = false;
            }
        }
    }

    //이동 정보 초기화
    public void ResetInitState()
    {
        canNextTrain = initCanNextTrain;

        gameObject.transform.position = startPos.position;
        gameObject.transform.rotation = startPos.rotation;

        if (autoStart)
            nowMove = true;

        if (stopPos != null)
            nowDestination = stopPos;
        else
            nowDestination = destPos;

        DestinationChange = autoMoveAfterRotate;
    }

    public void ChangeDestination()
    {
        if(canRotate)
        {
            //다음 목표 지점으로 목표지점 세팅 및 움직임 시작, 다음 기차로 교체 트리거 on
            nowDestination = destPos;
            nowMove = true;
            canNextTrain = true;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if(canNextTrain)
        {
            for (int i = 0; i < destCollider.Length; i++)
            {
                if (other == destCollider[i])
                {
                    nextTrain.gameObject.SetActive(true);
                    if (nextTrain.gameObject.GetComponent<AutoChangeTrain>() != null)
                        nextTrain.gameObject.GetComponent<AutoChangeTrain>().ChangeTrain(this);
                }
            }
        }    
    }

 

 

 

7/27에 배경에 이어진 선로에 따라 기차의 이동 방향이 변경되도록 하였다.

 

 

기존의 배경에 적용된 옵저버 패턴에 추가된 기능이다.

배경 회전이 끝날 시 SettedTrain을 통해 활성화되어 있는 기차에 대해 출발 가능 여부와 목적지가 세팅된다. 

public void SettedTrain()
    {
        bool trainActive = false;

        for(int i=0;i< ActiveRoadNum.Length;i++)
        {
            //현재 이어진 길에 활성화된 기차가 있는지 검사

            //최초 기차가 활성화되어 있을 경우 0번이 이어졌다면 트루
            if(firstTrain.isActiveAndEnabled && ActiveRoadNum[0])
            {
                roadChangeButton.Train = firstTrain;
                roadChangeButton.trainCanMove = true;

                if(i != 0 && ActiveRoadNum[i])
                {
                    destRoad = i;
                    roadChangeButton.SetDestPos(destRoad);
                }
            }
            else if(trains[i].isActiveAndEnabled && ActiveRoadNum[i])
            {
                activeTrain = i;
                roadChangeButton.Train = trains[i];

                //있다면 기차 출발 버튼 활성화
                trainActive = true;
                roadChangeButton.trainCanMove = true;
                
            }
            else if (ActiveRoadNum[i])
            {
                //기차가 활성화되지 않은 길은 자동으로 목적지가 된다.
                destRoad = i;
                roadChangeButton.SetDestPos(destRoad);
            }
        }

        if (!trainActive)
            activeTrain = 3;

        //Debug.Log("train : " + activeTrain + ", dest : " + destRoad);
        ChangeRotateAngle();
    }

 

 

 

public class StarRoadDirButton : RoadChangeButton

public void SetDestPos(int a_DestNum)
    {
        //목적지 설정
        settedDestPos = destPoses[a_DestNum];
        //목적지에 최종으로 들어올 기차가 어느 기차인지 설정
        settedNextTrain = nextTrains[a_DestNum];

        Debug.Log(train.nextTrain);

        //중간 회전하는 기차에 대해 목적지와 다음 기차 할당
        train.nextTrain.nextTrain = settedNextTrain;
        train.nextTrain.DestPos = settedDestPos;

        Debug.Log(train.nextTrain);
    }

    //클릭시 세팅된 기차 출발
    public override void OnMouseDown()
    {
        Debug.Log("click");
        if (trainCanMove)
        {
            //기차 목적지 변환 설정
            train.DestinationChange = true;

            //기차 실질적 움직임 시작
            train.nowMove = true;

            //출발 버튼 비활성화
            trainCanMove = false;
        } 
    }

 

 

'개발 > WHITE POLYGON' 카테고리의 다른 글

[퍼즐게임] WHITE POLYGON - 9  (0) 2022.08.01
[퍼즐게임] WHITE POLYGON - 8  (0) 2022.07.28
[퍼즐게임] WHITEPOLYGON - 6  (0) 2022.07.24
[퍼즐게임] WHITE POLYGON - 5  (0) 2022.07.19
[퍼즐게임] WHITEPOLYGON - 4  (0) 2022.07.18