거의 알고리즘 일기장

9.유니티 _ 피격 이벤트 구현 본문

유니티

9.유니티 _ 피격 이벤트 구현

건우권 2020. 5. 6. 02:58

적이나 장애물을 부딛쳤을때 피격이벤트를 영상을 보고 따라 구현해봤다.

 

1. 먼저 가시랑 몬스터에 대한 태그, 레이어들을 설정하고

가시 tag, layer 설정
몬스터 tag, layer 설정

 

2.  가시랑 몬스터랑 맞닿아도 겹쳐지나가게 하고, 플레이어가 데미지를 입은 상태에서는 적과 닿아도 피격이벤트가 발생하지 않게 하기 위해서 ( 무적시간 ) project settings에서 아래와 같이 체크를 해제해준다.

 

3. 아래와 같이 스크립트에 이벤트 내용을 추가해준다.

추가 이벤트내용으로는 적에게 닿았을때 몸을 흐리게 만들고 약간의 시간동안 무적시간을 갖게 했다.

void OnDamaged(Vector2 targetPos)
{
  //player  damaged
  gameObject.layer = 11;

  spriteRenderer.color = new Color(1, 1, 1, 0.4f);

    //reaction forc
    int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
    rigid.AddForce(new Vector2(dirc, 1)*10.0f, ForceMode2D.Impulse);
        
    //animation
    anim.SetTrigger("doDamaged");

    Invoke("OffDamaged", 2);
}

void OffDamaged()
{
    gameObject.layer = 10;
    spriteRenderer.color = new Color(1, 1, 1, 1);
}

private void OnCollisionEnter2D(Collision2D collision)
{
    //적에게 닿았을때
    if(collision.gameObject.tag == "Enermy")
        OnDamaged(collision.transform.position);
}

Player Script ( 전체 )

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float maxSpeed;
    public float jumpPower;
    bool isJump;
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    Animator anim;

    private void Awake()
    {
        isJump = false;
        anim = GetComponent<Animator>();
        rigid = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    //단발적인 입력은 update에
    void Update()
    {
        //stop speed
        if(Input.GetButtonUp("Horizontal"))
        {
            //normalized -> 벡터 크기를 1로 만든 상태
            rigid.velocity = new Vector2(rigid.velocity.normalized.x *0.5f, rigid.velocity.y);
        }

        //jump
        if (Input.GetButtonDown("Jump") && isJump == false)
        {
            isJump = true;
            rigid.AddForce(new Vector2(rigid.velocity.x, jumpPower), ForceMode2D.Impulse);
        }

        //방향전환
        if (Input.GetButton("Horizontal"))
        {
            bool v = (Input.GetAxisRaw("Horizontal") == -1.0f);
            spriteRenderer.flipX = v;
        }

        //walking motion
        if (Mathf.Abs(rigid.velocity.x) <= 0.3f)
            anim.SetBool("isWalking", false);
        else
            anim.SetBool("isWalking", true);

        //jump motion
        if(isJump == true)
            anim.SetBool("isJumping", true);
        else
            anim.SetBool("isJumping", false);
    }

    private void FixedUpdate()
    {
        //move by key control
        float h = Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);

        if (rigid.velocity.x > maxSpeed)
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        else if (rigid.velocity.x < maxSpeed*(-1))
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);

        if (rigid.velocity.y < 0)
        {
            //landing platform, 레이저로 쏴서 맞춘 첫번째 물체를 식별
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));

            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1,
                                                LayerMask.GetMask("Platform"));

            //땅에 닿았을때 다시 점프가능
            if (rayHit.collider != null)
                if (rayHit.distance <= 0.5)
                    isJump = false;
        }
    }

    void OnDamaged(Vector2 targetPos)
    {
        //player  damaged
        gameObject.layer = 11;

        spriteRenderer.color = new Color(1, 1, 1, 0.4f);

        //reaction forc
        int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
        rigid.AddForce(new Vector2(dirc, 1)*10.0f, ForceMode2D.Impulse);

        //animation
        anim.SetTrigger("doDamaged");

        Invoke("OffDamaged", 2);
    }

    void OffDamaged()
    {
        gameObject.layer = 10;
        spriteRenderer.color = new Color(1, 1, 1, 1);
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        //적에게 닿았을때
        if(collision.gameObject.tag == "Enermy")
            OnDamaged(collision.transform.position);
     }
}

동작

피격 이벤트 동작


참고

https://www.youtube.com/channel/UCw_N-Q_eYJo-IJFbNkhiYDA

 

골드메탈

게임 개발 & 그림 그리기 & 게임 플레이 각종 컨텐츠를 방송하는 스트리머 골드메탈 채널입니다. 주 컨텐츠는 게임 개발이며 유니티 엔진을 기반으로 컨텐츠를 진행합니다. - 2019.03.15 구독자 5천명 돌파! 감사합니다. - 2019.12.02 구독자 1만명 돌파! 감사합니다.

www.youtube.com


후기

이분 정말 재미있게 잘 알려주시는것 같다. 

반응형
Comments