2024-05-28

이재형·2024년 5월 28일
0
post-thumbnail
post-custom-banner

시작하기에 앞서

별로 남지 않는 강의를 빨리 수강하고 개인 프로젝트를 진행해야겠다.

Unity 공부

배운 내용

1. Mathf.Approximately

if(!Mathf.Approximately(a, b))
{
    // 구현
}

설명: float는 부동 소수점으로 같은 float값이라도 0.00001정도의 차이가 생길 수가 있는데 그럴 때 해당 Mathf.Approximately(a, b)를 사용하여 둘 사이가 근사한지 판단을 하게 해주는 함수이다.


2. public과 프로퍼티로의 변수 차이

public class PlayerCondition : MonoBehaviour, IDamagable
{
    public UICondition uiCondition;

	// 1. get을 이용할 때
    Condition health { get { return uiCondition.health; } }
    
    // 2. 선언하여 값을 받아올 때
    Condition health
    void Start()
    {
    	health = uiCondition.health
    }
    

설명: 둘이 같은 값의 필드를 가져온다는 것은 같지만 둘의 차이는 그 후에 차이가 난다.
1번 get을 사용할 경우에는 해당 필드의 값을 변경하면 같이 변경이 되지만 2번 선언 후 값을 받았을 때는 변수에 필드만 받아져 값을 변경하면 같이 변경이 되지 않는다.


프로젝트 개발 1일차

진행 사항

1. InputSystem을 이용한 이동, 점프 구현

사진1: Input Action사진

사진2: 입력 후 CallBackContext로 메서드 실행

public void OnLook(InputAction.CallbackContext context)
{
    mouseDelta = context.ReadValue<Vector2>();
}

public void OnJump(InputAction.CallbackContext context)
{
    if (context.phase == InputActionPhase.Started)
    {
        rigidbody.AddForce(Vector2.up * jumpPower, ForceMode.Impulse);
    }
}

public void OnMove(InputAction.CallbackContext context)
{
    // 버튼을 누르는 중이라면
    if (context.phase == InputActionPhase.Performed)
    {
        moveInput = context.ReadValue<Vector2>();
    }
    // 버튼을 안눌렀을 때
    else if (context.phase == InputActionPhase.Canceled)
    {
        moveInput = Vector2.zero;
    }
}

설명: 각 메서드를 이벤트에 추가 하여 이동 제어


2. 아이템 구현

public interface IItemInfo
{
    string ItemText();
}

public interface IConsumable
{
    void Use();
}

public enum ItemType
{
    Consumable,
    Resource,
    Equipment
}

[CreateAssetMenu(fileName = "Item", menuName = "New Item")]
public class ItemData : ScriptableObject
{
    [Header("Info")]
    public string itemName;
    public string description;
    public ItemType type;
    //public Sprite icon;
    //public GameObject dropPrefab;
}

설명: 아이템의 정보를 ScriptableObject를 이용하여 객체를 생성하여 저장할 수 있게 함


3. Raycast로 아이템 식별 후 Text로 출력

사진1: 사과 오브젝트 정보 생성 후 저장

사진2: 임시 오브젝트의 정보

public class PlayerInteraction : MonoBehaviour
{
    public float rayDistance;
    public LayerMask interactionLayer;
    public TextMeshProUGUI interactionText;
    private float rateTime = 0;
    private float checkTime = 0.1f;
    private Camera camera;

    private IItemInfo itemInfo;
    private GameObject interactionObject;

    private void Awake()
    {
        camera = Camera.main;
    }

    private void Update()
    {
        if (Time.time - rateTime > checkTime)
        {
            rateTime = Time.time;
            Interaction();
        }
    }

    private void Interaction()
    {
        Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
        RaycastHit hit;

        if(Physics.Raycast(ray, out hit, rayDistance, interactionLayer))
        {
            // 해당 오브젝트 UI에 나오게
            if (interactionObject == null)
            {
                interactionObject = hit.collider.gameObject;
                itemInfo = hit.collider.GetComponent<IItemInfo>();
                VoidText();
            }
        }
        else
        {
            interactionObject = null;
            itemInfo = null;
            interactionText.gameObject.SetActive(false);
        }
    }

    private void VoidText()
    {
        interactionText.gameObject.SetActive(true);
        interactionText.text = itemInfo.ItemText();
    }
}

설명: 카메라의 ScreenPointToRay를 이용하여 한 가운데로 Ray를 사용하여 거리인 rayDistance안에 있으며 레이어가 interactionLayer인 hit의 오브젝트의 정보를 받아서 해당 정보를 Text인 interactionText에 출력하게 함


정리

배운 내용

1. Mathf.Approximately: 두개의 값이 근사한지 알아내는 함수
2. public과 프로퍼티로의 변수 차이: 짧고 굵게 깊은,얕은 복사 느낌

해결 못한 문제

1. 없음

문제점

1. 없음

끝 마치며...

몇 번을 사용했지만 정확한 의미를 알지 못하고 넘어가는 경우가 많았는데 오늘 하룻동안 많은 기능을 다시 알게되고 이해를 하고 넘어가서 엄청 알찬 하루였던거 같다.

profile
한국사람
post-custom-banner

0개의 댓글