[개발일지] 나폴리탄스파게티 20230531

2023. 6. 9. 17:582학년 1학기 프로젝트

 


빛 관련 이벤트 구현

플레이어가 빛 밖에 일정시간 있을 경우 이벤트가 발생하도록 구현

어두운 곳에서 20초 이상 있을 경우 이벤트가 발생하며, 손전등을 들고 있을 경우는 30초가 지나야 이벤트 발생

어두운 곳에 있던 플레이어는 빛 안에 5초 이상 있어야 함 (5초 이상 머물러있지 않고 바로 어둠으로 나갈 경우 쌓이고 있던 초에 추가로 쌓임)

 

콜라이더를 사용해 빛 안의 범위를 지정하고 그 밖으로 나갈 경우 플레이어에게 1초당 1스택이 쌓이도록 하여 구현하였습니다. 플레이어가 콜라이더 접촉을 통해 빛 안에 있는지를 확인하고 빛 안에서 5초가 지나야 플레이어에게 쌓였던 스택이 초기화되도록 하였습니다.

public class PlayerEventController : MonoBehaviour
{
    public float eventStack; // 이벤트가 일어나기 위해 쌓여하는 스택
    public float playerStack; // 플레이어에게 현재 쌓인 스택
    public float lightTimeStack; // 플레이어의 스택이 초기화되기 위해 빛 안에서 유지해야하는 시간(초)
    public float lightNowTimeStack; // 빛 안에서 유지한 시간(초)

    bool inTheLights = true; // 플레이어가 빛 안에 있는지를 판단하는 변수

    void Update()
    {
        StackUpdate();

        // 이벤트 스택에 도달할 경우 이벤트 메서드 호출
        if(playerStack >= eventStack)
        {
            DarknessEvent();
        }
    }

    // 플레이어 오브젝트가 빛과 접촉해있을 경우 playerStack이 0으로 초기화 됨
    void OnTriggerStay(Collider collision)
    {
        inTheLights = true;
       
        if(lightNowTimeStack >= lightTimeStack)
        {
            StackInitialization();
        }
    }

    // 1초 = 1스택
    void StackUpdate()
    {
        // 스택을 쌓을 때 조건 부여: 플레이어가 빛 안에 있지 않을 때만 스택이 쌓임
        if(inTheLights == false)
        {
            playerStack += Time.deltaTime;
            lightNowTimeStack = 0;
        }
        // 스택을 쌓을 때 조건 부여: 플레이어가 빛 안에 있을 경우 초기화 스택이 쌓임
        else
        {
            if(playerStack != 0)
            lightNowTimeStack += Time.deltaTime;
        }
    }

    // 플레이어가 빛 밖으로 나갈 때 inTheLights False
    void OnTriggerExit(Collider collision)
    {
        inTheLights = false;
    }

    void StackInitialization()
    {
        lightNowTimeStack = 0;
        playerStack = 0;
        inTheLights = true;
    }

    void DarknessEvent()
    {
        Debug.Log("Event");
    }
}

 


그림 이벤트 구현

(미완료)

원래 그림이 사라지고 뒤틀린 그림이 나타남 이후 플레이어가 이 그림을 뒤집으면 일정시간 후에 다시 돌아오는 이벤트

그림이 뒤집어질 땐 뒤집어지는 모션이 따로 없음

public class PaintEvent : MonoBehaviour
{
    public GameObject originalPaint; // 본래 그림 오브젝트를 담을 변수
    public GameObject twistedPaint; // 뒤틀린 그림 프리펩을 담을 변수

    Vector3 paintPosition; // 그림의 Vector정보를 담을 변수

    void Start()
    {
        paintPosition = originalPaint.transform.position;
        Debug.Log(paintPosition);
    }

    void Update()
    {
    	// T키를 누를 경우 원래 그림 위치에 변형된 그림 생성 (임시)
        if(Input.GetKeyDown("t"))
        {
            Instantiate(twistedPaint, new Vector3(paintPosition));
        }
    }
}