Unity/2D RPG

원거리 공격 by Unity

YunSeong 2021. 7. 14. 19:42
728x90
반응형

포물선을 그리면서 날아가는 투사체를 이용해서 공격하는 것을 만들 것이다. 

 

 

투사체를 윗 방향으로 던진다면 거리가 있는 곳에 있는 적은 맞추기 쉽겠지만

가깝게 있는 작은 적은 맞추기 어려울 것이다. 

 

 

 

그렇기 때문에 앞쪽으로 던지고 아래쪽으로 중력을 가해서 포물선을 그리며 투사체가 

날아가도록 했다. 

 

 

 

 

 

 

그러기 위해서는 먼저 투사체 객체에 대한 코딩을 먼저 해야 한다. 

1
2
3
4
void Start()
{
    this.GetComponent<Rigidbody2D>().velocity = new Vector2(Velocity_x * Direction , 0); 
}
cs

player 이 보고 있는 방향을 1, -1로 Direction으로 들고 와서 투사체의 속도를 변경해줬다. 그리고 속도는 

처음 한번만 설정해주면 되기에 Start()에 넣었다. 

 

 

 

그리고  

1
2
3
4
void Update()
{
    this.GetComponent<Rigidbody2D>().AddForce(transform.up * -1 * gravityForce);
}
cs

아래쪽으로 gravityForce 만큼의 힘을 줘서 중력의 영향이 있는 것처럼 설정했다. Rigidbody2D를 이용해서 중력을 만들 수도 있었지만 나중에 혹시 궤도를 계산할 일이 있을지 모르기에 더 계산하기 편하게 힘으로 대체했다. 

 

 

 

 

그리고 투사체가 적에게 닿았을 때 맞는 것을 알아내기 위해서 

 

위의 사진과 같이 PolygonCollider과 BoxCollider을 만들었고 BoxCollider을 Trigger로 설정해서 적과 닿는 것을 판단하게 했다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool isGround = false;
 
void OnTriggerEnter2D(Collider2D other)
{
 
    if (other.tag != "Player" && other.tag != "Villain"//Player와 Villain이 아닌 땅이나 아이템 위에 닿았다면 바닥에 떨어진 취급을 함
    {
        this.isGround = true;
    }
 
    if (other.tag == "Villain" && !this.isGround)
    {
        Vector3 posForThrowingATK = new Vector3(transform.position.x, transform.position.y, transform.position.z);
        GameObject go = Instantiate(effect, posForThrowingATK, Quaternion.Euler(0f, 20f, 0f)) as GameObject;
        Destroy(gameObject);
    }    
}
cs

OnTriggerEnter2D(Collider2D other)을 이용해서 플레이어나 적이 아닌 무언가와 닿았다면 땅에 떨어졌다고 인식해서 isGround가 true가 된다. 

 

그래서 두번째 if문에서 땅에 떨어지지 않았고 적이랑 닿았다면 그 자리에 Instantiate()로 effect object를 소환한다. 

그다음에 이 투사체는 사라진다. 

 

 

실제로 데미지를 달게 하고 싶다면 적의 component에 미리 public 변수로 만들어 놓은 Hp 변수를 가져와서 깎으면 될 것이다.

 

 

 

 

 

위와 같은 effect를 prefab를 만들고 거기에 아래와 같은 c#파일을 Component로 넣어준다면 자동 effect가 소환된 후 사진이 지난 후 없어져서 자연스러운 투사체가 될 것이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float time = 0.1f;
float curTime;
 
void Start()
{
    this.curTime = this.time;
}
 
void Update()
{
    if (curTime <= 0)
    {
        Destroy(gameObject);
    }
    else
    {
        curTime -= Time.deltaTime;
    }
}
cs

 

 

 

 

728x90
반응형

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

회복 아이템 by Unity  (0) 2021.07.18
캐릭터(슬라임) by Unity  (0) 2021.07.18
카메라 무빙 by Unity  (0) 2021.07.08
근접 공격 by Unity  (0) 2021.07.07
유닛 이동 by Unity  (0) 2021.07.07