728x90
728x90
Vector3 중요해 - Magnitude VS sqrMagnitude 의 차이를 알고 적절히 사용
Coroutine 중요해 (-yield 와 짝꿍)
혹시 모르니 Fadeout 스크립트 ↓
void InitGame()
{
LevelImage = GameObject.Find("LevelImage");
levelText = GameObject.Find("LevelText").GetComponent<Text>();
levelText.text = "Day" + level;
LevelImage.SetActive(true);
StartCoroutine(FadeOut());
Invoke("HideLevelImage", 2);
}
IEnumerator FadeOut()
{
Image sprite = LevelImage.GetComponent<Image>();
for (float a = 1; a > 0; a -= 0.005f)
{
Color color = sprite.color;
color.a = a;
sprite.color = color;
yield return null; //한프레임 휴식 (1/60초)
}
}
방향키 삽입과 특정위치로 움직이고 벽이나 몬스터가 있는 경우 가지 못함
[SerializeField] LayerMask BlockingLayer;
BoxCollider2D myCollider;
private void Start()
{
myCollider = GetComponent<BoxCollider2D>();
}
private void Update()
{
int h = (int)Input.GetAxis("Horizontal"); //GetAxis VS GetAxisRaw
int v = (int)Input.GetAxis("Vertical"); //GetAxis VS GetAxisRaw
if (h != 0 || v != 0) Move(h, v);
}
void Move(int xDir, int yDir) //이동할 곳에 장애물 존재여부 확인
{
Vector2 start = transform.position;
Vector2 end = start + new Vector2(xDir, yDir);
myCollider.enabled = false;
RaycastHit2D hit = Physics2D.Linecast(start, end, BlockingLayer);
myCollider.enabled = true;
if (hit.transform == null) //ray에 감지된 물체가 없다 ---> 이동하시오
{
StartCoroutine(SmoothMove(end));
return;
}
}
플레이어 - > wall 공격
적 -> 플레이어 공격
플레이어가 wall 공격 -> wall 사라짐
using UnityEngine;
using System.Collections;
public class Wall : MonoBehaviour
{
int hp = 3;
public void DamageWall(int loss)
{
hp -= loss;
if (hp <= 0) gameObject.SetActive(false);
// || Destory(gameObject); 그러나! 삭제보다 비활성이 더 나음
}
}
AttempMove
void AttempMove(int xDir, int yDir)
{
RaycastHit2D hit;
bool canMove = Move(xDir, yDir, out hit);
if (canMove) return; //공격여부확인 -> ray에 감지된 대상이 존재 -> wall 인지 다른 존재인지
Wall target = hit.transform.GetComponent<Wall>();
if (target != null) target.DamageWall(1);
}
bool Move(int xDir, int yDir, out RaycastHit2D hit) //이동할 곳에 장애물 존재여부 확인
{
Vector2 start = transform.position;
Vector2 end = start + new Vector2(xDir, yDir);
myCollider.enabled = false;
hit = Physics2D.Linecast(start, end, BlockingLayer);
myCollider.enabled = true;
if (hit.transform == null) //rat에 감지된 물체가 없다 ---> 이동하시오
{
StartCoroutine(SmoothMove(end));
return true;
}
return false; // 공격여부판단
728x90
'유니티 > C#' 카테고리의 다른 글
17. 인벤토리 만들기-2 (0) | 2023.04.12 |
---|---|
14. 간단 로그라이크 만들기 - 5 (0) | 2023.04.06 |
12. 간단 로그라이크 만들기 - 3 (0) | 2023.04.04 |
11. 간단 로그라이크 만들기 - 2 (0) | 2023.04.03 |
10. 간단한 로그라이크 게임 만들기 Start (0) | 2023.03.31 |