티스토리 뷰
금일 작업 목록
- 필드 최대 범위 지정하기
- 필드 외곽에 벽 설치하기 [벽 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);
}
}
}
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learnd - Day 1 (0) | 2024.09.09 |
---|---|
(사전 캠프) Day 19 [실전 제작: 멍뭉이! 멍멍뭉!] (2) | 2024.09.06 |
(사전 캠프) Day 17 - 멍뭉이! 멍멍뭉! ~ 귀신 잡는 개멍대! (0) | 2024.09.04 |
(사전 캠프) Day 16 - 멍뭉이! 멍멍뭉! ~ 귀신 잡는 개멍대! (4) | 2024.09.03 |
(사전캠프) Day 15 - 멍뭉이! 멍멍뭉! ~ 귀신 잡는 개멍대! (0) | 2024.09.02 |