Unity/2D RPG

캐릭터 나눠지고 합쳐지게 by Unity

YunSeong 2021. 8. 5. 21:54
728x90
반응형

 

 

 

 

슬라임을 공격했을 때 두 개의 작은 슬라임으로 분해되고 

슬라임끼리 만났을 때 하나의 큰 슬라임으로 합쳐지도록 만들 것이다. 

 

 

 

 

 

 

 

 

1. 나눠지게

먼저 슬라임이 공격 받았을 때 작은 슬라임으로 나누어지게 하기 위해서 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
float smallScale = this.transform.localScale.z * 2 / 3;
public GameObject slime;
 
public void divideSlime()
{
    if (!(this.smallScale < 0.1f))
    {
        GameObject slime_1 = Instantiate(this.slime, this.transform.position + new Vector3(0.5f, 00), this.transform.rotation) as GameObject;
        GameObject slime_2 = Instantiate(this.slime, this.transform.position + new Vector3(-0.5f, 00), this.transform.rotation) as GameObject;
 
        slime_1.GetComponent<Transform>().localScale = new Vector3(this.smallScale, this.smallScale, this.smallScale);
        slime_2.GetComponent<Transform>().localScale = new Vector3(this.smallScale, this.smallScale, this.smallScale);
    }
}
cs

위와 같은 코드를 짰다.

1 - scale의 x, y 부분은 움직이면서 음수가 될 수도 있기 때문에 그의 절댓값을 transform.localScale.z에 저장해놨다. 

그래서 그것에 2/3[2차원인 슬라임을 반으로 나누면 길이는 1/(루트2) 배일 것이기 때문에 그것의 근삿값]을 곱해줘서 작은 슬라임의 Scale을 구해줬다. 

2 - 슬라임의 prefab를 넣어줬다.

 

6 - 계속해서 작아지면 영원히 안 죽기 때문에 0.1f보다 작아지지 않도록 했다.

 

8~9 - 슬라임 두개를 소환해준다.

11~12 - 방금 소환한 두 슬라임의 크기를 2열에서 정한 작은 슬라임의 크기로 만들어줬다.

 

* 2열에서 prefab를 넣어줄 때 슬라임 자신과 똑같은 prefab을 넣어주면 분해될 때의 상태를 가진 슬라임이 소환되서 최소 크기까지 연속으로 나눠지는 문제가 있었다. 그래서 slime prefab를 복사해서 서로의 slime 객체에 서로의 prefab을 넣어줘서 해결했다.

(자신과 똑같은 prefab를 만들고 그것을 Instantiate로 소환한다면 소환의 개념이 아니라 복제의 개념인 것 같다.)

 

 

 

 

 

슬라임의 Hp이 0이 됐을 때 위 함수를 호출하고 Destroy(gameObject)를 통해 큰 슬라임은 없어지도록 했다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 합쳐지게

슬라임이 만났을 때 합쳐지게 할 때 큰 슬라임을 소환하거나 하는 주된 일을 하는 슬라임을 2마리의 슬라임 중에 정해야했다. 나는 x 좌표가 크고 작음을 가지고 정하기로 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private bool isDone = false;
public GameObject slime;
private float bigScale;
private Vector3 otherPos;
private Vector3 otherScale;
 
 
void OnTriggerStay2D(Collider2D other)
{
    if (other.name.Substring(05== "slime" && !this.isDone) 
    {
        this.isDone = true;
        this.otherPos = other.GetComponent<Transform>().position;
        this.otherScale = other.GetComponent<Transform>().localScale;
        if (this.otherPos.x > this.transform.position.x)
        {
            Vector3 pos = new Vector3((transform.position.x + this.otherPos.x) / 2, (transform.position.y + this.otherPos.y) / 2, transform.position.z);
            GameObject slime_3 = Instantiate(this.slime, pos, transform.rotation) as GameObject;
 
            this.bigScale = (float)Mathf.Sqrt(this.otherScale.z * this.otherScale.z + this.transform.localScale.z * this.transform.localScale.z);
 
            slime_3.GetComponent<Transform>().localScale = new Vector3(this.bigScale, this.bigScale, this.bigScale);
            Destroy(other.gameObject);
            Destroy(gameObject);
        }
        else
        {
            this.isDone = false;
        }
    }
}
cs

1 - 한번에 여러마리의 슬라임과 닿아있다면 여러 슬라임의 코드들이 꼬일 수도 있기에 한마리의 슬라임과만 합쳐지도록 하기 위해서 이 변수를 만들었다.

8 - Trigger로 설정된 collider에 다른 collider이 들어와있다면 위 함수가 호출된다.

10 - 슬라임들의 이름의 맨 앞에 slime으로 설정했고 그것을 이용해서 들어온 충돌체가 슬라임의 것임을 확인한다. this.isDone으로 이것이 실행된적이 있는지 확인한다.

12 - 이 부분이 실행됐었다는 것을 표시한다.

15 - 자신의 x좌표가 더 작을 때 자신이 큰 슬라임을 소환한다.

17~18 - 두 슬라임의 x, y좌표의 평균을 구해서 중간위치를 구하고 거기에 슬라임을 소환한다.

20~22 - 나눠질 때와 똑같은 이유로 Scale을 정했다. 그것을 소환된 슬라임에 적용한다.

23~24 - 소환을 끝마치고 합쳐지게 된 두 슬라임을 삭제한다.

26~29 - 만약 x좌표가 더 커서 합쳐질 때 흡수 당할 슬라임이 2마리 이상이 됐을 수도 있기 때문에 그 1마리에 안 들었다면 나중에 또 합쳐질 수 있어야하기 때문에 초기화 해줬다.

 

 

 

 

 

 

 

 

 

이렇게만 하면 나눠지자마자 합쳐질 수도 있기 때문에 

나눠지면 몇 초 동안 합쳐지지 않게 할 필요가 있는 거 같다.

1
2
3
4
5
6
7
8
9
10
11
void Start()
{
    StartCoroutine("canSumCount");
}
 
IEnumerator canSumCount()
{
    yield return new WaitForSeconds(3);
    this.canSum = true;
 
}
cs

coroutine을 이용해서 3초 뒤에 this.canSum을 변경해주고 

이 변수를 저 위에 if문의 조건으로 달아줬다.

그렇게 나눠지거나 소환되고 3초 뒤부터 소환될 수 있게 만들었다.

 

 

 

 

 

 

 

 

3. 결과

위 1, 2에서 만든 코드를 적용시키면 위 영상과 같이 자연스러운 슬라임을 구현할 수 있다.

 

 

 

 

 

 

 

 

728x90
반응형

'Unity > 2D RPG' 카테고리의 다른 글

키 배치 설정 by Unity  (0) 2021.08.18
Canvas에서 메뉴 by Unity  (0) 2021.08.18
friction, Collider2D in Unity  (0) 2021.08.02
캐릭터(원거리 공격) byUnity  (0) 2021.07.24
회복 아이템 by Unity  (0) 2021.07.18