C#/C# 학습 (TIL)

C# Unity 다형성 실습

jjiing 2022. 4. 13. 13:28

실습 내용 :
볼이 벽에 5번 닿으면 사라짐
스톤 벽에는 10번 닿으면 사라짐. 1/3의 확률로 닿아도 데미지 감소 없음(빗나감).
우드 벽에는 2번 닿으면 사라짐. 사라질 때 나무 아이템을 생성함.

 

1. 바닥, 볼, 벽 만들기

-assets 창에서 material 추가 후 색 적용
-충돌을 위해 볼에는 rigidbody 추가 (static collider끼리는 충돌 안일어남)
-rigidbody에서 중력 해제



2. 벽 컨트롤 스크립트

-내구도 변수 설정 : public으로 유니티에서 직접 설정할 수 있게
-내구도감소 함수
-삭제되는 함수 : 내구도가 0이 되면 오브젝트 삭제됨. update 이벤트 함수에 적용

public class wallControl : MonoBehaviour
{
    public int wallHP;          //내구도 변수
    
    void Update()
    {
        if(wallHP<=0)           //내구도<0되면 삭제되는 함수 호출
        {
            Die();
        }
    }
    public virtual void GetDamage(int damage)   //내구도 감소 함수
    {
        wallHP -= damage;
    }

    public virtual void Die()                   //게임오브젝트 삭제 함수
    {
        Destroy(gameObject);

    }
}

여기서 virtual 처리는 이후 있을 다형성 처리를 위해 한 것으로
현재까지 진행상황에서는 virtual 처리를 하지 않아도 무방하다.



3. 볼 컨트롤 스크립트

-충돌시 벽이면 내구성을 깎는 함수 호출

private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Wall")
        {
            Debug.Log(collision.gameObject.name+"충돌발생");
            collision.gameObject.GetComponent<wallControl>().GetDamage(1);
        }
    }
  • 이는 이벤트 함수로 start나 update가 아닌 구역에 선언해줘야한다.
  • 벽일 경우에만 삭제가 되야 하기 때문에 tag기능을 사용해 해당 경우만 지정해줬다.

    태그는 위 인스펙터 창에서 직접 추가할 수 있다.
  • collision으로는 게임 오브젝트 내의 tag나 이름, GetComponent와 같은 함수 호출이 불가능하다. collision.gameObject.으로 호출해줘야한다.
  • collision.gameObject.GetComponent<wallControl>().GetDamage(1);
    충돌한 오브젝트 내의 wallControl이라는 스크립트의 public 함수(GetDamage)를 불러옴


4. 우드 벽 스크립트 생성

우드 벽은 사라질 때 나무 아이템이 생성되는 부분이 다르므로 wood를 상속하되, Die()함수를 수정해줘야한다.

public class WoodWallControl : wallControl
{
    public GameObject woodItem;
 
    public override void Die()
    {
        Destroy(gameObject);
        Instantiate(woodItem, transform.position, transform.rotation);
    }
}
  • Monobehaviour대신 walControl 상속
  • Die() 함수 오버라이드 처리, 부모함수에는 가상함수 처리
  • Instantiate를 사용해 벽이 사라질 때 아이템 생성 처리
  • 생성될 우드 아이템 public gameObject 변수 처리
  • wallHP는 Inspector창에서 직접 2로 설정
  • 부모함수의 스크립트를 자동으로 가지고 있다면 삭제처리



5. 스톤 벽 스크립트 생성

스톤 벽은 데미지를 입는 확률 처리를 다르게 해줘야 하기 때문에 wood를 상속하되, GetDamage()함수를 수정해줘야한다.

public class StoneWallControl : wallControl
{
    public override void GetDamage(int damage)
    {
        int randomValue = Random.RandomRange(1, 3);
        if (randomValue == 1)
        {
            Debug.Log("빗나감");
        }
        else
        {
            wallHP -= damage;
        }
    }
}
  • Monobehaviour대신 walControl 상속
  • GetDamage() 함수 오버라이드 처리, 부모함수에는 가상함수 처리
  • Random.Range(범위시작,범위끝)을 사용해 확률 처리
  • wallHP는 Inspector창에서 직접 10으로 설정
  • 부모함수의 스크립트를 자동으로 가지고 있다면 삭제처리

 

실습파일 링크

https://github.com/jjiing/Practice-Unity/tree/main/C%23/%EC%8B%A4%EC%8A%B5(%ED%8C%8C%EC%9D%BC) 

 

GitHub - jjiing/Practice-Unity

Contribute to jjiing/Practice-Unity development by creating an account on GitHub.

github.com