2023/12/26

안석환·2023년 12월 26일
0

오늘 배운 코드


1. Linq를 이용한 문자열 정렬

💾 코드

using System.Linq;
public class Solution {
    public string solution(string s) {
        string answer = new string(s.OrderByDescending(c => c).ToArray());
        //문자열 s의(.)요소(c(charValue))를내림차순으로 정렬하겠다(c => c) 정렬한 요소를 배열화 한다(ToArray)
        return answer;
    }
}

  1. 3D 플레이어 점프 기능 구현

💾 코드

public class PlayerController : MonoBehaviour
{
    public void OnJumpInput(InputAction.CallbackContext context)
    {
        if(context.phase == InputActionPhase.Started)
        {
            if(IsGrounded())
            //플레이어가 땅에 있는가에 대한 참 거짓(bool)값
                _rigidbody.AddForce(Vector2.up * jumpForce, ForceMode.Impulse);
                //점프의 힘만큼 이차원 Y방향에 순간적으로 객체에 힘을 가한다.
                //자세히: 강체(Rigidbody)에 물리엔진(중력, 힘, 속도 등)중 힘(AddForce)을 (2차원중 위쪽방향으로 점프의 힘(jumpForce)만큼 순간적인 힘으로) 가합니다
                

        }
    }
}

📖 참고

namespace UnityEngine
{
	public void AddForce(Vector3 force, [UnityEngine.Internal.DefaultValue("ForceMode.Force")] ForceMode mode) => this.AddForce_Injected(ref force, mode);
      public enum ForceMode
  {
    ///강체에 지속적인 힘을 가한다
    Force = 0,
   
    ///강체에 순간적인 힘을 가한다
    Impulse = 1,
    
    ///강체에 순간적인 속도변화를 가한다
    VelocityChange = 2,
    
    ///강체에 지속적으로 가속도를 가한다
    Acceleration = 5,
  }
}

  1. 플레이어가 땅에 붙어 있는지 감지

💾 코드

public class PlayerController : MonoBehaviour
{
    private bool IsGrounded()
    {
        Ray[] rays = new Ray[4]
        //레이 4개를 정의 합니다
        {
            new Ray(transform.position + (transform.forward * 0.2f) + (Vector3.up * 0.01f) , Vector3.down),
            new Ray(transform.position + (-transform.forward * 0.2f)+ (Vector3.up * 0.01f), Vector3.down),
            new Ray(transform.position + (transform.right * 0.2f) + (Vector3.up * 0.01f), Vector3.down),
            new Ray(transform.position + (-transform.right * 0.2f) + (Vector3.up * 0.01f), Vector3.down),
            //레이는(=) (객체의(+) (앞, 뒤, 왼쪽, 오른쪽(-+forward, right) 기준 0.2f 만큼 넓고) (+) (위로 0.01만큼 높은곳에서)(,) 아래로 향한다)
        };

        for(int i = 0; i < rays.Length; i++)
        {
            if (Physics.Raycast(rays[i], 0.1f, groundLayerMask))
            //해당 레이케스트를(해당 배열의 값으로 0.1f 만큼 쏜 대상이 해당 레이어 마스크(groundLayerMask))라면
            {
                return true;
                //true를 반환한다
            }
        }

        return false;
        //false를 반환한다
    }

    private void OnDrawGizmos()
    // Scene 뷰에서 Gizmos로 시각적인 표시를 제공하는 메서드
    {
        Gizmos.color = Color.red;
        //Gizmos의 색깔을 빨강으로 설정한다

        Gizmos.DrawRay(transform.position + (transform.forward * 0.2f), Vector3.down);
        Gizmos.DrawRay(transform.position + (-transform.forward * 0.2f), Vector3.down);
        Gizmos.DrawRay(transform.position + (transform.right * 0.2f), Vector3.down);
        Gizmos.DrawRay(transform.position + (-transform.right * 0.2f), Vector3.down);
        //위의 레이를 Gizmos를 통해 시각적으로 보여준다
    }
}

📖 참고

namespace UnityEngine
{
    public Ray(Vector3 origin, Vector3 direction)
    //3차원 기존위치와 방향을 매개변수로 참조한다
    {
      this.m_Origin = origin;
      this.m_Direction = direction.normalized;
      //해당 매개변수를 설정한다
    }
    
    public static bool Raycast(Ray ray, float maxDistance, int layerMask) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, maxDistance, layerMask);
    //참 거짓(bool)값의 레이케스트의 매개변수(시작위치와 이동할 방향(Ray ray), 최대 이동거리(maxDistance), 레이어마스크의 인트값(Int LayerMask))으로 쏘아서  해당 레이어 마스크의 인트값 이 맞는지 확인하여 참 거짓 값으로 반환한다
}




🧐기본 공부 내용


  1. Strategy Pattern(전략 패턴)
  • 같은 종류의 작업을 하는 알고리즘을 정의, 각 알고리즘의 캡슐화, 알고리즘들의 동적 관리를 가능하게하여 유연성을 늘리는 패턴
  • 기능 구현 예제: 모체가 되는 추상클래스(계산기능, 숫자들...)에 필수로 구현해야 될 메소드를 지정해주고 공통된 기능들은 virtual을 통해 상속해준다.
    모체를 상속받을 자식클래스는 모체 클래스의 필수 기능들을 구현해준다
    기능들을 실제로 구현할 클래스를 만들어 모체의 형식을 받아 변수로 지정해주고 안에 있는 기능들을 구현하여준다

  • 참고 이미지


    계산기의 덧셈 뺄셈 과정의 전략 패턴이다





⛔️ 에러


  1. Quaternion 값을 eulerAngle 값으로 변환하여 수정하고 다시 Quaternion 값으로 변환하는 과정중 원하는 각도로 회전하지 않는 현상

💾 코드

void Update ()
{
    var angles = transform.rotation.eulerAngles;
    //각도를 오일러 각도로 변환
    angles.x += Time.deltaTime * 10;
    //변환한 오일러 각도의 x축을 기준으로 프레임마다 10 씩 회전시켜줄 값을 설정한다
    transform.rotation = Quaternion.Euler(angles);
    //해당 객체 각도를 변환한 오일러각도를 쿼터니언 각도로 변환하여 움직여준다
}
  • 문제점: 쿼터니언 각도를 오일러 각도로 변환하면 원하는 각도의 상태가 아닌 각도가 나온다 해당 각도를 기준으로 돌기때문에 원하던 0,0,0 x축 기준 각도의 변화가 일어나지 않는다
  • 문제점: 결과적으로 오일러각도에서 변환시켜주기 때문에 짐벌락 문제(한 축이 소실되는 문제)도 일어난다.
  • 해결방법: 쿼터니언 각도를 수정하지 않고 쿼터니언 각도를 통해 회전시킨다

💾 코드

void Update ()
{
float x;
void Update ()
{
    x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(x,0,0);
}
}

위의 코드에는 지정되어 있는 쿼터니언 값을 수정하려는 시도가 없다





💭 느낀점


1. 느낀점: 지금 필요한 일의 우선순위를 정하여 그에 맞게 공부하자 지금 중요하지 않은 강의에 목메일 필요가 없어보인다
profile
안석환!

0개의 댓글