본문 바로가기
유니티/C#

13. 간단 로그라이크 만들기 - 4

by 찡사랑방 2023. 4. 5.
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