티스토리 뷰

금일 작업 목록

  • 필드 최대 범위 지정하기
    • 필드 외곽에 벽 설치하기 [벽 6개로 정6각형 구성]
    • 몬스터 생성 범위 제한하기 [원형 범위로 제한]
    • 벽 통과하지 않도록 플레이어 및 적의 몇몇 요소 수정하기
  • 상태이상 구현하기
    • 버프 / 디버프 구현하기
    • 행동 제한형 상태이상 구현하기

 

새로운 요소

원형/구형 범위 내 랜덤 좌표 지정

더보기

원형 범위

UnityEngine.Random.insideUnitCircle

반지름 1.0f 이내의 원형 범위에서 랜덤한 좌표를 지정한다.

 

구형 범위

UnityEngine.Random.insideUnitSphere

 반지름 1.0f 이내의 구형 범위에서 랜덤한 좌표를 지정한다.

Rigidbody - 정적(Static), 키네마틱(Kinematic), 동적(Dynamic)

더보기

Rigidbody의 Body Type에 관한 내용.

  • Static: 멈춰있는 오브젝트. Rigidbody를 이용한 물리 법칙을 통해서는 이동되지 않는다.
  • Kinematic: 이동은 가능하나, 중력이나 충돌 등을 통해서는 이동되지 않는다.
  • Dynamic: 물리 법칙을 완전히 적용하는 오브젝트.

Rigidbody를 통한 이동 구현

더보기

[3D] Vector3 Rigidbody.velocity

[2D] Vector2 Rigidbody2D.velocity

  • Rigidbody의 '속도'에 해당하는 속성.
  • Quaternion.Euler(Vector3(x각도, y각도 z각도))를 이용해서 원하는 각도로 이동이 가능하다.
    [3D] Quaternion.Euler(Vector3) * Vector3.forward
    [2D] Quaternion.Euler(Vector3) * Vector2.right
  • 가속도를 받으려면 velocity 대신 AddForce를 사용하면 된다.
    • 단, 이 경우 mass값에 반비례하여 가속도가 형성되는 방식이므로, 이와 관련된 연산에 주의해야 한다.

해상도 크기에 영향이 없는 위치 배정 (Casvas 한정)

더보기

RectTransform.AnchoredPosition

  • Inspector에서 RectTransform의 position 다루듯 다룰 수 있는 위치 변수.
  • UI를 구성할 때 매우 중요한 요소. 이것이 아닌, 그냥 position을 사용하면 해상도에 따라서 위치가 달라진다.

 

결과물

 

 

코드

적 객체(오브젝트 생성 기능만)

더보기
public virtual void Set_Position()
{
    Vector3 Rand_Position;

    do
    {
        Rand_Position = UnityEngine.Random.insideUnitCircle * 15.0f;
    } while (Vector3.Distance(GameManager.Instance.Player_Unit.transform.position, Rand_Position) < 2.5f);

    transform.position = Rand_Position;
}

상태이상(상태이상 적용 관련 일부)

더보기

상태이상 적용 및 제거

void Update()
{
    while (i < Status_List.Count)
    {
        bool is_Over = Status_List[i].Activate_Status();

        if (is_Over)
        {
            Status_List.RemoveAt(i);
            Destroy(Status_Icon_List[i]);
            Status_Icon_List.RemoveAt(i);
            for (int j = i; j < Status_List.Count; j++)
                Status_Icon_List[j].GetComponent<RectTransform>().anchoredPosition += Vector2.left * 17.0f;
        }
        else
            i++;
    }
}

public void Get_Status(Status_Base _Status)
{
    Status_Cell temp_Cell = new Status_Cell(_Status, gameObject);

    Status_List.Add(temp_Cell);
    GameObject temp_Icon = Instantiate(original: Status_Icon, parent: Status_UI.transform);
    temp_Icon.GetComponent<RectTransform>().anchoredPosition = new Vector2((Status_List.Count - 1) * 17.0f, 0.0f);
    temp_Icon.GetComponent<Status_Icon>().Set_Icon(temp_Cell);
    Status_Icon_List.Add(temp_Icon);
}

 

상태이상 아이콘

public class Status_Icon: MonoBehaviour
{
    Status_Cell Cell;

    [SerializeField]
    Image Time_Cur;

    [SerializeField]
    GameObject Degree_Obj;
    TextMeshProUGUI Degree_Text;


    // Start is called before the first frame update
    void Start()
    {
        Degree_Text = Degree_Obj.GetComponent<TextMeshProUGUI>();
    }

    // Update is called once per frame
    void Update()
    {
        Time_Cur.fillAmount = ((float)Cell.Status.Time_Max - (float)Cell.Time_Cur) / (float)Cell.Status.Time_Max;

        Degree_Obj.SetActive(false);
    }

    public void Set_Icon(Status_Cell _Sta_Cell)
    {
        gameObject.SetActive(false);
        Cell = _Sta_Cell;
        gameObject.SetActive(true);
    }
}

 

 공격 적용부

private void OnTriggerStay2D(Collider2D collision)
{
    if (!Hitted_Units.Contains(collision.gameObject) && is_On)
    {
        Hitted_Units.Add(collision.gameObject);

        if (collision.gameObject.CompareTag("Enemy"))
        {
            for (int i = 0; i < Status_List.Count; i++)
                if (Status_List[i].On_Enemy)
                    collision.gameObject.GetComponent<Enemy_Cell>().Get_Status(Status_List[i]);

            if (is_friendly)
                collision.gameObject.GetComponent<Enemy_Cell>().Get_Damage(Damage);
        }

        else if (collision.gameObject.CompareTag("Player"))
        {
            for (int i = 0; i < Status_List.Count; i++)
                if (Status_List[i].On_Ally)
                    collision.gameObject.GetComponent<Player>().Get_Status(Status_List[i]);

            if (!is_friendly)
                collision.gameObject.GetComponent<Player>().Get_Damage(Damage);
        }
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함