odyssey

#8 odyssey 개발일지 : 장애물 만들기

san10 2023. 4. 3. 19:41

장애물 생성

장애물을 만들기 위해, 우선 장애물 역할을 할 바위를 그렸다..

이끼낀 바위

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObstacleGenerator : MonoBehaviour
{
    public GameObject obstacle;
    public GameObject testTerrain;

    public void CreateObstacle(GameObject terrain)
    {
        Vector2[] points = terrain.GetComponent<PolygonCollider2D>().points;

        int randomPoint = Random.Range(2, points.Length - 2);
        Vector3 obstaclePos = new Vector3(points[randomPoint].x, points[randomPoint].y, 2);
        obstaclePos += terrain.transform.position;

        float obstacleSlope = (points[randomPoint + 1].y - points[randomPoint - 1].y) /
            (points[randomPoint + 1].x - points[randomPoint - 1].x);
        float obstacleAngle = Mathf.Atan2(obstacleSlope, 1f) * Mathf.Rad2Deg;
        Quaternion obstacleRotation = Quaternion.Euler(new Vector3(0, 0, obstacleAngle));
        Instantiate(obstacle,obstaclePos , obstacleRotation);
    }
   
}

지형을 미리 생성해놓기에, 지형을 매개변수로 받고

뼈대역할을 하는 points에서 랜덤하게 한값을 뽑아서 그 위치에 생성한다!

 

회전하지 않고 그대로 생성하니깐

굴곡이 큰 곳에서는 어색하게 보여서 회전시켰다.

생성될 인덱스의 앞 뒤 포인트의 기울기를 구하고,

아크탄젠트로 각도를 구하고...

결과값이 라디안이기에 도수법으로 변환을 위해 Mathf.Rad2Deg을 곱했다!

 

 

결과 화면

 

플레이어 충돌 감지

플레이어가 달리다가 장애물이랑 충돌하면,

우선 멈추고, 게임을 종료해야 한다.

 

구현하기 위해서, 저번에 만들어뒀던 상태 패턴에 Stop 상태를 추가했다.

using UnityEngine;

public class PlayerStopState : MonoBehaviour, IPlayerState
{
    public void Handle(PlayerController controller)
    {
        controller.rigid.velocity = new Vector2(0, 0);
    }
}

그리고 플레이어 입장에서 충돌을 감지하면 stop상태로 바꾸고 게임을 종료하는 PlayerObstacleCollision를 작성했다.

using UnityEngine;

public class PlayerObstacleCollision : MonoBehaviour
{
    public PlayerController playerController;

    void OnCollisionEnter2D(Collision2D target)
    {
        if (target.collider.CompareTag("Obstacle"))
        {
            Debug.Log("게임종료");
            playerController.SetStop();
        }
    }
}

충돌을 감지하면 PlayerController에 접근해서 Stop상태로 만든다.

그리고 아직 게임종료까지는 구현하지 않아서 로그만 띄우게 했다..

결과