구현 목표: 회색의 플레이어 오브젝트가 점프하여 빨간 상자를 건드렸을 때 상자가 튀어오르는 듯한 움직임을 보인 뒤 동전 오브젝트를 생성 후 파괴되도록 함
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.동전 오브젝트가 생성되는 방식은 다음과 같다.
private void Awake() {
ranCoin = Random.Range(3,11); //랜덤하게 코인의 개수를 정한다
coinArr = new GameObject[ranCoin]; //위에서 정한 개수만큼 오브젝트를 담을 배열을 생성
for(int i = 0; i < ranCoin; i++){ //골드 1 : 실버 4 비율로 랜덤하게 배열에 오브젝트를 push
int ranCoinType = Random.Range(0,5);
if(ranCoinType == 0){
coinArr[i] = GoldCoin;
}else{
coinArr[i] = SilverCoin;
}
}
}
void PopCoin(){
if(isTouch){
for(int i = 0; i < ranCoin; i++){
GameObject coin = Instantiate(coinArr[i], transform.position * Vector2.up * 1.5f, transform.rotation);
float coinDirection = Random.Range(-1f,2f);
Rigidbody2D rigid = coin.GetComponent<Rigidbody2D>();
rigid.AddForce(new Vector3(coinDirection, coinPopPower, 0), ForceMode2D.Impulse);
}
}
}
Awake단에서 coinBox가 생성되었을 때 몇개의 동전 오브젝트가 생성될지 랜덤으로 결정되도록 하고 그 개수만큼 배열을 만든다.
이후 배열에 두가지 종류의 동전이 들어가는데 이 또한 확률에 맞게 랜덤으로 결정된다.
그 다음 Update에 PopCoin() 함수를 호출한다.
PopCoin함수는 배열의 개수만큼 동전 오브젝트를 생성하는데 생성한 뒤 오브젝트를 랜덤한 힘으로 위로 솟아오른 뒤 떨어지도록 구현했다.
구현 된 모습은 위와 같다.
4.동전 오브젝트 획득
void OnCollisionEnter2D(Collision2D other){
if(other.gameObject.tag == "Coin"){
if(other.gameObject.name == "GoldCoin"){
gameManager.score += 30;
}else if(other.gameObject.name == "SilverCoin"){
gameManager.score += 10;
}
Destroy(other.gameObject);
}
}
동전이 떨어진 이후 player가 획득하는 과정을 구현하기 위해 player스크립트에 oncollisionEnter2D를 이용했다.
충돌이 감지된 오브젝트의 태그를 인식한 뒤 동전 오브젝트가 맞을 경우 종류에 따라 gameManager의 score 변수를 증가하도록 했다.
그리고 처리가 끝난 오브젝트는 파괴하도록 했다.
4-1.
public void GetSilverCoin(){
score = score + 10;
}
public void GetGoldCoin(){
score = score + 30;
}
score 변수의 증가는 gameManager스크립트에서 함수를 이용할 수도 있다.
'개?발 > Unity 혼공' 카테고리의 다른 글
지면 점프(위 지형으로 점프하기) (0) | 2023.11.07 |
---|---|
공격(HitBox)좌우 반전(position, localPosition) (0) | 2023.11.07 |
벽 미끄러짐 및 지상 감지 방식(Collider 2D,platform effector 2D, side friction) (0) | 2023.10.25 |
플레이어 근접공격 및 적 상호작용 (0) | 2023.10.24 |
Unity 2D 경사로 미끄러짐 (0) | 2023.10.23 |