구현 목표: 회색의 플레이어 오브젝트가 점프하여 빨간 상자를 건드렸을 때 상자가 튀어오르는 듯한 움직임을 보인 뒤 동전 오브젝트를 생성 후 파괴되도록 함
1.플레이어 오브젝트가 빨간 상자를 건드리면
public CoinBox coinBox;
private void OnCollisionEnter2D(Collision2D other) {
if(other.gameObject.name == "CoinBox"){
coinBox.isTouch = true;
}
}
위의 코드에 의해 coinBox의 isTouch를 true로 변경한다.
2-1. 방법 1
public class CoinBox : MonoBehaviour
{
public bool isTouch;
public float upPower;
Rigidbody2D rigid;
private void Start() {
rigid = GetComponent<Rigidbody2D>();
}
void Update()
{
if(isTouch){
rigid.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
}
BoxUp();
isTouch = false;
}
void CrashBox(){
gameObject.SetActive(false);
}
void BoxUp(){
if(isTouch == true){
rigid.AddForce(Vector2.up * upPower,ForceMode2D.Impulse);
Invoke("CrashBox", 0.2f);
}
}
}
isTouch가 true로 변경됨에 따라 freezeposition으로 고정되어 있던 오브젝트를 고정해제한다. 단, 원하는 움직임의 좌표는 y이므로 x좌표, z회전은 여전히 freezing한다.
BoxUp함수를 호출한 뒤 다시 isTouch를 false로 변경하는 이유는 isTouch가 계속해서 true일 경우 BoxUp이 계속해서 호출되어 오브젝트가 지속적으로 상승하는 효과를 가져온다.
이것은 원하는 움직임이 아니므로 BoxUp이 한번만 실행되도록 isTouch를 다시 false로 변경한다.
이후 BoxUp의 Inoke에 따라 0.2초 후 CrachBox 함수가 호출되고 오브젝트는 파괴된다.
2-2. 방법 2.
void OnCollisionEnter2D(Collision2D other){
if(other.gameObject.name == "Player"){
isTouch = true;
}
}
충돌 이벤트를 적용시켜 coinBox측에서 player와 충돌했을 때 isTouch를 true로 변경하는 방법
이 경우 coinBox를 프리펩으로 사용할 경우 사용할 수 있다.
3.동전 오브젝트가 생성되는 방식은 다음과 같다.