C# Unity 다형성 실습
실습 내용 :
볼이 벽에 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