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

2023. 6. 11. 17:382학년 1학기 프로젝트

 


화장실 물소리 이벤트

물이 떨어지는 소리가 들린다면 화장실에서부터 이어지는 액체를 따라 이동하고 삐뚤어진 액자를 올바르게 정리하도록 함

이벤트가 진행되면 액자의 각도가 틀어지도록 함

오브젝트에 AudioSource 컴포넌트 부착하여 주변에서 소리가 들리도록 함

 

Reverb Zone Mix: 오디오 리스너가 리버브 존 내 어디에 위지해 있는지에 따라 오디오 클립을 왜곡. 즉 높을수록 3D음향에 가까워짐

 

추가설정

Min Distance: 20

Max Distance: 300

public class WaterSoundEvent : MonoBehaviour
{
    public bool event6 = false; // 이벤트 진행 변수
    public GameObject soundPlayer; // 물방울 소리를 나도록 할 오브젝트

    void Update()
    {
        if(event6 == true)
        {
            Event(); // 이벤트 매니저를 통한 이벤트 진행
        }

        // E키를 누를 경우 그림이 원래대로 돌아옴 (임시)
        if(Input.GetKeyDown("e"))
        {
            Original();
        }
    }

    // 액자 이벤트
    void Event()
    {
        // 물이 떨어지는 소리 재생
        soundPlayer.SetActive(true);
        // 액자가 삐뚤어지도록 함
        gameObject.transform.rotation = Quaternion.Euler(0, 0, 20);
        // 액자로 연결되는 액체 생성
        
    }

    // 액자가 원래대로 돌아오도록 함
    void Original()
    {
        // 물이 떨어지는 소리 종료
        soundPlayer.SetActive(false);
        // 액자가 원래대로 돌아옴
        gameObject.transform.rotation = Quaternion.Euler(0, 0, 0);
        // 이벤트 종료
        event6 = false;
    }
}

 


그림 이벤트

(미완성) 모든 그림에서 검붉은 색 액체가 흐르는 이벤트와 그림이 틀어지는 이벤트가 발생할 수 있습니다. 때문에 생성된 그림들 중 이벤트를 진행할 그림을 랜덤으로 뽑아야 합니다. 또한 이미 이벤트가 진행중인 그림에 다른 이벤트가 동시에 진행되면 안되기 때문에 이벤트가 중복되지 않도록 확인하는 기능 작성하였습니다. 기존에 있던 두 스크립트를 이 스크립트 하나로 합치는 작업을 하였습니다.

public class PaintsManager : MonoBehaviour
{
    public GameObject[] paints;        // 각각의 그림을 받아옴
    public GameObject[] twistedPaint;  // 변형된 그림들을 받아옴
    public GameObject blood;           // 피모형을 받아옴

    public bool event2 = false; // 이벤트 2진행 변수
    public bool event3 = false; // 이벤트 3진행 변수
    public bool destroyBlood = true; // 검붉은 액체가 사라지게 할 변수 (수정하기)

    int goEvent; // 이벤트를 진행할 그림

    int nowEvent2;
    int nowEvent3;

    int eventType;

    // 그림들이 생성될 위치
    Vector3[] paintsPositions = 
    {
        new Vector3(5, 2, 1),   // 0
        new Vector3(10, 2, 1),  // 1
        new Vector3(15, 2, 1),  // 2
        new Vector3(20, 2, 1),  // 3
    };

    List<int> nowPaintEvent = new List<int>(); // 이벤트를 진행중인 그림 정보를 저장할 리스트 

    void Start()
    {
        // 지정된 위치에 그림을 생성함
        for(int i = 0; i < paints.Length; i++)
        {
            SpawnPaints(paints[i], paintsPositions[i]);
        }
    }

    void Update()
    {
        // 이벤트 매니저에서 2 true를 받았을 때 (이후 수정할 것)
        if(Input.GetKeyDown("n"))
        {
            EventPaintPick(2);
        }

        // 이벤트 매니저에서 3 true를 받았을 때 (이후 수정할 것)
        if(Input.GetKeyDown("b"))
        {
            EventPaintPick(3);
        }
    }

    // 그림을 생성함
    void SpawnPaints(GameObject paintObject, Vector3 spawnPoint)
    {
        GameObject paint = Instantiate(paintObject);
        paint.transform.position = spawnPoint;
    }

    // 이벤트를 진행할 그림을 추첨
    void EventPaintPick(int a)
    {
        int paintPick = Random.Range(0, paints.Length); // 여러 그림중 하나를 뽑음
        eventType = a;
        Check(paintPick);
    }

    // 이벤트를 진행하기 위해 뽑은 그림이 이벤트 진행중인지 아닌지를 확인
    void Check(int checkEvent)
    {
        bool isThere = nowPaintEvent.Contains(checkEvent); // 중복된 값이 있는지 확인

        // 중복값이 있을 경우 재추첨
       if(isThere == true)
       {
            EventPaintPick(eventType);
            Debug.Log("값 중복됨");
       }
       // 중복값 없을 경우 진행 확정
       else
       {
            goEvent = checkEvent; // 진행 확정
            nowPaintEvent.Add(goEvent); // 진행중인 물체 정보 리스트에 담음
            
            if(eventType == 2)
            {
                Event2(goEvent);
            }
            else
            {
                Event3(goEvent);
            }
       }
    }

    void Event2(int a)
    {
        nowEvent2 = a;
        Transform paintPosition = paints[a].transform ;
        GameObject bloodPrefab = Instantiate(blood, paintPosition);
    }

    // Event2 종료
    void Event2End()
    {
        destroyBlood = true;
        event2 = false; // 이벤트 종료
        CompleteEvent(nowEvent2);
    }

    void Event3(int a)
    {
        nowEvent3 = a;
    }

    // 이벤트 진행 종료 후 list에 담긴 이벤트 정보 삭제
    void CompleteEvent(int completeEvent)
    {
        int indexCompleteEvent = nowPaintEvent.IndexOf(completeEvent); // List에 저장된 이벤트 종류가 몇번에 저장되어있는지 찾아줌
        nowPaintEvent.RemoveAt(indexCompleteEvent);  // 완료된 이벤트 정보 제거
    }
}