Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
9.유니티 _ 피격 이벤트 구현 본문
적이나 장애물을 부딛쳤을때 피격이벤트를 영상을 보고 따라 구현해봤다.
1. 먼저 가시랑 몬스터에 대한 태그, 레이어들을 설정하고
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
후기
이분 정말 재미있게 잘 알려주시는것 같다.
반응형
'유니티' 카테고리의 다른 글
11. 유니티 _ 3D 닷지 (0) | 2020.05.12 |
---|---|
10. 유니티 _ 간단 2D 플랫포머 게임 (0) | 2020.05.07 |
8. 유니티 _ 몬스터 움직임 구현 (0) | 2020.05.05 |
7. 유니티 _ 타일맵 (0) | 2020.05.05 |
6. 유니티 _ 아틀라스, 애니메이션, 이동, 점프 (3) | 2020.05.05 |
Comments