Unity_2기 내일배움캠프 TIL

Unity_2기 7주차 (231220)

잼잼재미 2023. 12. 20. 23:48

구현 내용


1. 스킬 진동 효과

 

 

ShakeCamera 스크립트

[SerializeField] private float _shakeAmount = 1f;
[SerializeField] private float _shakeTime = 0.5f;

private void Start()
{
    StartCoroutine(Shake(_shakeAmount, _shakeTime));
}

IEnumerator Shake(float shakeAmount, float shakeTime)
{
    float timer = 0;
    while (timer <= shakeTime)
    {
        Camera.main.transform.rotation = Quaternion.Euler((Vector3)UnityEngine.Random.insideUnitCircle * shakeAmount);
        timer += Time.deltaTime;
        yield return null;
    }
    Camera.main.transform.rotation = Quaternion.Euler(0f, 0f, 0f);
}

 

코루틴을 이용해서 메인카메라 rotation 값을 변경했다. 처음에는 position 값을 수정하려고 했으나, 메인카메라가 Player를 따라 움직이도록 구현되어있어서 rotation 값을 변경했다. position 값을 변경한 것과 비슷한 효과가 나왔다.

 

 

2. PotionItem 습득 효과

 

 

ColorChange 스크립트

private SpriteRenderer _spriteRenderer;
private Color _originColor = new Color(255/255f, 255/255f, 255/255f, 255/255f);
private Color _changeColor;
private IEnumerator _coroutine;
[SerializeField] private float _repeatTime;
[SerializeField] private float _finishTime;

private void Start()
{
    _spriteRenderer = GameManager.instance.DataManager.Player.GetComponentInChildren<SpriteRenderer>();
}

public void PlayerColorChange(Color changeColor)
{
    _coroutine = ColorInOut();
    _changeColor = changeColor;
    StartCoroutine(_coroutine);
    StartCoroutine(Stop());
}

private IEnumerator ColorInOut()
{

    while (true)
    {
        yield return StartCoroutine(ColorChanges(_originColor, _changeColor));
        yield return StartCoroutine(ColorChanges(_changeColor, _originColor));
    }
}

private IEnumerator ColorChanges(Color start, Color end)
{
    float current = 0;
    float percent = 0;

    while (percent < 1)
    {
        current += Time.deltaTime;
        percent = current / _repeatTime;

        _spriteRenderer.color = Color.Lerp(start, end, _repeatTime);

        yield return null;
    }
}

IEnumerator Stop()
{
    yield return new WaitForSeconds(_finishTime);
    StopCoroutine(_coroutine);
    _spriteRenderer.color = _originColor;
}

 

PotionItem을 먹을 때, 캐릭터가 깜빡이는 효과를 구현했다. 코루틴을 사용해서 캐릭터의 SpriteRenderer에 접근해서 칼라값을 변경해주고 일정 시간 뒤, 칼라값을 복구했다. 처음에는 StopCoroutine을 사용해서 코루틴을 멈추도록 했는데, 코루틴이 완전히 멈추지 않고 칼라 복구가 되는 오류가 발생했다. 결국에는 StopCoroutine을 사용하지 않고 구현했는데, StopCoroutine을 사용하려면 private IEnumerator _coroutine 과 같이 변수에 코루틴을 넣어서 사용해야 된다는 것을 알게되었다.

 

 

PotionItem 스크립트

public void SpeedItem()
{
    _spriteRenderer.color = new Color(255, 255, 255, 0);
    _circleCollider.enabled = false;
    _colorChange.PlayerColorChange(new Color(86 / 255f, 106 / 255f, 255 / 255f, 255 / 255f));

    _originSpeed = GameManager.instance.DataManager.PlayerCurrentStats.speed;
    GameManager.instance.UpdatePlayerStatsDatas(0, 0, (int)_originSpeed);

    StartCoroutine(RestoreSpeed());
}

 

그리고 칼라값을 할당할 때, Color 값에 0과 1사이의 부동 소수점을 받기 때문에 소수점 형태로 나타내야 한다.

 

https://kkln2486.tistory.com/192

 

칼라 변경

using UnityEngine.UI; using TMPro; public TMP_Text _damageText; _damageText.color = new Color(91/255f, 90/255f, 89/255f, 255/255f); * Color 클래스는 각 색상 채널에 대해 0과 1사이의 부동 소수점을 받기때문에 위와 같이 소수점

kkln2486.tistory.com

 

 

오늘의 회고


오늘은 어제 구현한 것들에 버그 수정과 추가 몇가지 구현을 했다. 오늘 가장 어려웠던 부분은 코루틴 사용 부분이었다. 코루틴을 정지하기 위해서는 IEnumerator 변수에 값을 할당해서 StopCoroutine을 해야한다는 것을 알게되었지만 결국 StopCoroutine을 사용하지 못하고 구현했다. 코루틴에 대해서 조금더 정리가 필요한 것 같다. 그리고 스킬이 적중할 때, 진동하는 효과를 혼자서 구현했는데 생각보다 게임의 퀄리티가 올라간 것 같아서 좋았다. 내일이 팀 프로젝트 제출, 발표날이기 때문에 오전까지 잘 마무리하도록 하겠다!

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 7주차 (231222)  (0) 2023.12.22
Unity_2기 7주차 (231221)  (0) 2023.12.21
Unity_2기 7주차 (231219)  (1) 2023.12.19
Unity_2기 7주차 (231218)  (0) 2023.12.18
Unity_2기 6주차 (231215)  (1) 2023.12.15