분류 전체보기
- 설계 :: 디자인 패턴 - 브릿지패턴,템플릿메소드패턴,경량화패턴설계 2024.11.08
- TIL : 2024-11-08(금) :: 디자인패턴 - 전략(strategy), 컴포지트(Composite), 퍼사드(Facade) 패턴 2024.11.08
- 설계 :: 디자인 패턴 - 전략패턴,프로토타입패턴,컴포지트패턴,퍼사드패턴 2024.11.08
- TIL : 2024-11-07(목) :: 객체가 경사로를 이동할때 튀어오르는 버그 잡기(법선벡터와 투영벡터를 2024.11.07
- TIL : 2024-11-06(수) :: Inspector에 2차원 배열 표시하기 2024.11.06
- TIL : 2024-11-05(화) :: 물체가 계속 고정좌표로 이동하고 싶으면서 충돌 처리를 하고 싶을때 (예시 : 플레이어가 오브젝트를 잡은 상태를 구현할때) 2024.11.05
- TIL : 2024-10-28(월) :: RigidBody.velocity 및 RigidBody.AddForce를 이용한 물리계산시 Time.deltaTime 및 Time.FixeddeltaTime을 연산하지 않는것이 좋다. 2024.10.28
- TIL : 2024-10-25(금) :: Unity3D에서 InputSystem을 사용하여 캐릭터 이동 및 카메라 회전 제어하기 2024.10.25
설계 :: 디자인 패턴 - 브릿지패턴,템플릿메소드패턴,경량화패턴설계
TIL : 2024-11-08(금) :: 디자인패턴 - 전략(strategy), 컴포지트(Composite), 퍼사드(Facade) 패턴
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2024-11-12(화) :: 트러블 슈팅 - 데이터 변경하여 사용시에 Class에서 분리해서 사용하자 (0) | 2024.11.12 |
---|---|
TIL : 2024-11-11(월) :: MVC 패턴에 대한 간단 분석 (0) | 2024.11.11 |
TIL : 2024-11-07(목) :: 객체가 경사로를 이동할때 튀어오르는 버그 잡기(법선벡터와 투영벡터를 (0) | 2024.11.07 |
TIL : 2024-11-06(수) :: Inspector에 2차원 배열 표시하기 (0) | 2024.11.06 |
TIL : 2024-11-05(화) :: 물체가 계속 고정좌표로 이동하고 싶으면서 충돌 처리를 하고 싶을때 (예시 : 플레이어가 오브젝트를 잡은 상태를 구현할때) (0) | 2024.11.05 |
설계 :: 디자인 패턴 - 전략패턴,프로토타입패턴,컴포지트패턴,퍼사드패턴
전략 패턴 ( Strategy Pattern )
목적을 이루기 위해 정해진 공통의 행동이 있지만 그 안에서 공통의 행동전략들을 만들어 접근하는 패턴
예시 1)
A가 공항을 가기야된다라는 목적
1.차를 타고 간다. -> 이동한다.
2.비행기를 타고 간다. -> 이동한다.
3.걸어간다. -> 이동한다.
이동이라는 행동이 있지만 각 전략(동작)들이 다 다르다.
예시 2)
Player가 게임 아이템과 충돌했을때 사용되려는 목적
1.회복 아이템을 획득 했다. -> 아이템의 획득 및 사용
2.공격 아이템을 획득 했다. -> 아이템의 획득 및 사용
이런식으로 사용이 가능해진다.
그럼 이때 행동전략의 회복아이템,공격 아이템의 동작방식이 다를 경우 각 class의 로직을 따로 작성을 해줄수도 있다.
Interface를 이용하여 전략의 틀(규칙)을 정한뒤
각 Item들은 Interface를 상속하여 사용하고 (Item의 부모클래스에만 해도 사용 가능)
그 아이템을 먹은 Player class에서 해당 인터페이스를 변수를 호출하여 사용하는것이다.
즉, 이 위의 행동들을 간단하게 요약하면 [일반적으로 같은 작업을 수행하는 다양한 방법을 선택] 하는 것이다.
예시 코드
예시 코드는 플레이어가 월드에 뿌려진 아이템을 Ray 로 검출시 UI에 아이템 설명이 출력되고
상호작용 키를 누르면 아이템이 플레이어 클래스의 저장되고 해당 아이템은 사라진다다. 즉 이 두 목적은 모든 아이템에서 동일하게 일어나기에 목적으로 설정하여 전략패턴으로 사용이 가능해지는 것이다.
IInteractable.cs & itemObject.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
//아이템은 보통 여러 종류가 있고 기능도 다르게 동작하는 것들도 있을것이다.
//그럴때마다 클래스를 새로 만들거나 if문으로 계속 연결하면서 만들면 작업 효율 및 가독성이 떨어지고 결합성은 올라가 스파게티 코드가 되어버린다.
//그런점을 방지하기 위해 Interface를 해서 Item에서 공통적으로 사용하는 기능들을 미리 선언하여 묶어 사용하기로 한다.
public interface IInteractable //상호작용이 가능한 오브젝트 인터페이스
{
public string GetinteractPrompt(); // 화면에 띄워줄 Prompt 함수들을 작성
public void OnInteract(); // 상호작용시 어떤 효과를 발동할건지 결정해주는 함수
}
public class itemObject : MonoBehaviour, IInteractable
{
public ItemData data;
public string GetinteractPrompt()
{
string str = $"{data.displayName}\n{data.description}";
return str;
}
public void OnInteract()
{
CharacterManager.Instance.Player.itemData = data;
CharacterManager.Instance.Player.additem?.Invoke();
Destroy(gameObject); //상호작용하면 월드에 있는 아이템은 기능을 다했으므로 사라져야한다.
}
}
Player 객체가 아이템에 다가가면(Ray로 검사) GetinteractPrompt() 메서드로 UI에 아이템 이름 및 설명을 출력하고
OnInteract() 메서드로 상호작용 키를 누르면 각 아이템의 해당 기능(행동 전략)을 동작하는 기능이다.
InterAction.cs ( 플레이어 Class 내에 참조도어 사용중 )
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
//상호작용 기능을 하는 Class
//카메라에서 Ray를 쏴서 충돌되는 오브젝트들의 IInteractalbe 컴포넌트가 있는지 로 체크하여 사용할 예정
public class Interaction : MonoBehaviour
{
public float checkRate = 0.05f; //Ray를 다시 쏘게하는 체크 주기(최신화)
private float lastCheckTime; //마지막에 Ray를 쏜 시간 저장
public float maxCheckDistance; // Ray의 측정거리
public LayerMask layerMask; //Raycast시 사용되는 레이어마스크(어떤 레이어가 달려있는 게임오브젝트 체크기준)
//캐싱하는 자료가 이 두 변수에 담겨져있음
public GameObject curInteractGameObject; // 상호작용 성공시 해당 아이템의 게임오브젝트를 저장할 변수
private IInteractable curInteractable; // 해당 게임오브젝트를 캐싱할 Interface 변수
//인강 수업 진행중에는 Inspector에서 넣어서 사용하지만 나중에는 스크립트로 불러오게 하는것을 생각해봐야함
public TextMeshProUGUI promptText; // 상호작용시 뜨는 prompt, //UI와 기능 분리시 어떡해 할지 리팩토링 추천
private Camera camera; //Ray를 카메리 기준으로 발사할것이기에 카메라를 멤버변수로 선얺
// Start is called before the first frame update
void Start()
{
camera = Camera.main;
}
// Update is called once per frame
void Update()
{
if(Time.time - lastCheckTime > checkRate)
{
lastCheckTime = Time.time;
//new Vector3(Screen.width / 2, Screen.height / 2) : 화면의 정 중앙에서 Ray를 쏘게 하기위해 /2 연산을 함
Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxCheckDistance, layerMask))
{
if (hit.collider.gameObject != curInteractGameObject)
{
curInteractGameObject = hit.collider.gameObject;
curInteractable = hit.collider.GetComponent<IInteractable>();
SetPromptText();
}
}
else
{
curInteractGameObject = null;
curInteractable = null;
promptText.gameObject.SetActive(false);
}
}
}
private void SetPromptText()
{
promptText.gameObject.SetActive(true);
promptText.text = curInteractable.GetinteractPrompt();
}
public void OnInteractInput(InputAction.CallbackContext context)
{
/*curInteractable != null : 인터액션 상호작용을 하려면 현재 상호작용이 가능한
타겟(IInteractable 상속클래스)가 있어야되기때문에 조건문에 추가*/
if (context.phase == InputActionPhase.Started && curInteractable != null)
{
curInteractable.OnInteract();
curInteractGameObject = null;
curInteractable = null;
promptText.gameObject.SetActive(false);
}
}
}
프로토타입 패턴 ( ProtyType Pattern )
Prototype은 실제 산업에서는 대량생산전 각종 테스트를 수행하는데 사용된다.
하지만 코드영역 에서는 Prototype은 자기 자신을 복사본으로 찎어내는 틀에 가깝습니다.
유니티에는 기본적으로 Prototype 디자인패턴이 적용되어있는데
Prefab에 적용되어 있습니다. 우리가 각종 오브젝트들과 컴포넌트를 합쳐 하나의 프리팹으로 만들고
그 프리팹을 호출하여 월드에 배치하는 것이 프로토타입패턴입니다.

컴포지트 패턴 ( Composite Pattern )
Composite 패턴은 단일 객체와 복합 객체를 동일하게 다룰 수 있게 해주는 디자인 패턴입니다.
이 패턴은 객체들을 트리 구조로 구성하여, 부분-전체 계층 구조를 표현할 수 있습니다.
복합 객체(Composite)와 단일 객체(Leaf)를 같은 인터페이스로 다루게 되므로, 클라이언트는 객체의 구성 요소가 단일 객체인지, 복합 객체인지 신경 쓸 필요 없이 동일한 방식으로 조작할 수 있습니다. 그렇기에 각종 컴포지트에서 편하게 동일한 메서드를 호출하여 사용 할 수 있게 하는것이 장점입니다.
Unity에서 GameObject의 Inspector에 들어가는 다양한 컴포넌트들이 Composite 패턴입니다. GameObject는 여러 컴포넌트를 가질 수 있으며, 각각을 독립적으로 관리하면서도 GameObject 하나에 모두 붙일 수 있습니다. GameObject는 복합 객체로, 각 컴포넌트는 단일 객체로 작동하며, 둘 모두 동일한 방식으로 조작됩니다.



퍼사드 패턴 ( Facade Pattern )
하나의 객체에서 동작해야되는 하위 동작들을 전부 참조하여 사용하는 패턴을 퍼사드 패턴이라고한다.
예시1)
플레이어 객체는
조작(Controller),
모델 출력(SpriteRenderer,MeshRenderer),
스테이터스(StatusHandler),
상호작용(Interaction)
등등 많은 하위 동작들이 필요하다.
플레이어 Class내에 조작,모델출력,스테이터스,상호작용 등등을 참조해서 사용하고 조작 같은경우 이동,공격,점프,회피 등등 여러 행동들이 있는데 이것은 또 추가의 파서드 패턴이 되어 관리하게된다.
즉, 하나의 객체에 여러 하위 동작들을 담아 사용하는것을 퍼사드 패턴이라고 한다.
Player.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public PlayerController controller;
public PlayerCondition condition;
public Equipment equip;
public ItemData itemData; //상호작용하는 아이템 데이터를 저장하는 변수 (타겟 오브젝트)
public Action additem; //event를 선언하여 아이템을 추가하는 함수
public Transform dropPosition; //인벤토리에서 아이템을 버리는 위치 변수
private void Awake()
{
CharacterManager.Instance.Player = this;//캐릭터 매니저에 자기 자신을 등록
controller = GetComponent<PlayerController>();
condition = GetComponent<PlayerCondition>();
equip = GetComponent<Equipment>();
}
}
플레이어 클래스의 컨트롤러,컨디션(스테이터스관리),장착,Item 등등 하위 동작들을 참조하여 사용하고
그 행동에서도 또 다른 행동이 있을떄 또 퍼사드패턴으로 구현되어 있게 해놓았다.
참고자료
https://refactoring.guru/ko/design-patterns/flyweight/csharp/example
'설계' 카테고리의 다른 글
설계 :: Object Pooling(오브젝트 풀링) (0) | 2024.10.14 |
---|---|
설계 :: OPP(객체 지향 프로그래밍)에서 SRP(단일 책임 원칙) 설계하기 (0) | 2024.10.07 |
TIL : 2024-11-07(목) :: 객체가 경사로를 이동할때 튀어오르는 버그 잡기(법선벡터와 투영벡터를
객체가 경사로를 이동할때 위로 뿅하고 튀어오르는 현상이 있을거다. 분명 나는 인풋으로 x,z축 데이터만 넣었는데 왜 경사로에서 튀어오르는지 의문일 것이다.
y값을 보정으로 하고있어도 경사로의 콜라이더와 플레이어의 콜라이더가 충돌이 일어나 생기는 힘이기 때문에 위로 튀어오를수 밖에 없을것이다.
이럴떄는 경사도의 법선벡터를 이용하여 투영벡터를 계산해서 진행방향을 알아내야한다.
경사도를 오르는 객체의 아랫방향(Vector3.down)으로 ray를 쏴서 해당 경사면의 각도를 알아야한다.
p.s 경사도의 각도를 알아야하는 이유
경사면의 각도를 알아야 하는 이유는 이동오브젝트가 여기 경사면을 넘을수 있는지 없는지를 체크하기 위해서다.
즉, 완만한 경사면 오를수 있을것이고 급한경사는 못오르는 maxSlopeAngle 변수를 설정해서 컨트롤 해 줄수 있게 해야된다.
그러기위해서 경사면의 노말벡터(법선벡터,Slopehit.Normal) 과 윗 방향의 벡터(Vector3.up) 사이의 각도를 구한뒤에 넘어갈수 있는 각도인지 체크한다.
넘어 갈수 있게되면 해당 경사면의 진행 방향을 알아야된다.
ProjectOnPlane() 메서드를 사용하여 내가 이동하는 방향벡터 movediretion 과 경사도의 법선벡터 slopeHit.normal의 투영 벡터를 구해야만 해당 경사도에서의 이동 방향을 구 할수 있게된다.
그림으로 간단히 표현한 블로그가 있어 사진을 퍼왔다.
위의 설명한 이론을 아래 코드로 구현해보았다.
public class PlayerController : MonoBehaviour
{
private Rigidbody rigid;
public PlayerStatus status;
[Header("Slope Handling")] //경사도에 올라갈시 위로 솟아오르는 현상 제어
public float maxSlopeAngle; //해당 경사도 보다 작은경우 캐릭터가 올라갈수 있게 설정
private RaycastHit slopeHit; //캐릭터 밑 경사도의 법선벡터 호출용으로 사용되는 변수
[Header("Movement")]
private Vector2 curMoveInput;
private Vector3 moveDirection;
public Vector3 ExtraDir; //외부에서 힘을 가할떄 x,z축 이동방향값을 보정해주는 변수
[Header("IsGrounded")]
public float RayDistance;
public Transform GroundPivot;
public LayerMask GroundMask;
//y축 보정을 스크립트로 중력 추가 보정 함수
private void ApplyCustomGravity()
{
// 중력을 수동으로 추가하여 y축 낙하를 더 강하게 설정
Vector3 gravity = Physics.gravity * 3.0f;
rigid.AddForce(gravity, ForceMode.Acceleration);
}
//캐릭터의 이동을 담당하는 함수
public void Move()
{
//z축(forward)와 x축(right)방향 입력값을 받음
moveDirection = curMoveInput.y * transform.forward + curMoveInput.x * transform.right;
//점프를 하지 않는 이상 y축 값은 변동이 없기에 y축 보정
float velocity_Y = rigid.velocity.y;
//경사도 기울기 체크
if (OnSlope())
{
//경사로에 있기 때문에 경사로의 객체 속도 보정
moveDirection = GetSlopeMoveDirection();
//경사로에 진행방향에 맞춰 y축도 속도를 보정해준다.
velocity_Y = moveDirection.y * status.CurSpeed;
}
Vector3 moveVelocity = moveDirection * status.CurSpeed;
rigid.velocity = new Vector3(moveVelocity.x, velocity_Y, moveVelocity.z) ;
}
//플레이어 객체가 경사도에 있는지 체크 및 이동 가능한지 확인하는 함수
private bool OnSlope()
{
Ray ray = new Ray(GroundPivot.position, Vector3.down);
//0.3f는 경사도에 있기에 추가로 더 길게 쏜것
if (Physics.Raycast(ray, out slopeHit, 0.3f, GroundMask))
{
// Vector3.Angle : 두개의 벡터 사이의 각도값을 구하는 함수
/*해당 로직은 월드 y축(uP) 방향과 경사로의 법선벡터(slopehit) 사이의 각도를 받아온다.*/
float angle = Vector3.Angle(Vector3.up, slopeHit.normal);
return angle <= maxSlopeAngle && angle != 0;
}
return false;
}
//경사로에 있기 때문에 경사로의 객체 속도를 보정해주는 함수
private Vector3 GetSlopeMoveDirection()
{
//경사로에 있는 객체의 진행 방향을 알기위해서는 투영벡터를 사용해야된다.
//투영벡터를 사용하기 위해서 ProjectOnPlane() 메서드를 사용한다.
Vector3 reflectV = Vector3.ProjectOnPlane(moveDirection, slopeHit.normal).normalized;
if (reflectV != Vector3.zero)
{
Debug.Log(reflectV);
}
return reflectV;
}
}
해당 글을 작성하며 도움 받은 자료
https://www.youtube.com/watch?v=xCxSjgYTw9c&t=378s
https://code-piggy.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-Vector3ProjectOnPlane
Unity- Vector3.ProjectOnPlane()
Vector3.ProjectOnPlane() public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal); 파라미터 vector- 정사영하고자 하는 벡터 planeNormal - plane의 법선 벡터 반환 vector3 - vector를 평면의 법선 벡터 planeNormal에
code-piggy.tistory.com
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2024-11-06(수) :: Inspector에 2차원 배열 표시하기
개발중에 <포탈> 모작의 퍼즐류 게임에서 각종 스위치,오브젝트를 기믹대로 완수하여 길을 열거나 보상을 받는 것을 구현하고싶었다. 2차원 배열을 사용하여 하나의 행에 해당 기믹이 완료되면 그 행에 있는 모든 보상이 받아지게 하고 싶었다.
구현 자체는 쉽지만 Inspector에 개발자가 쉽게 접근하여 수정을 했으면 원했다.
Inspector로 2차원 배열을 표현하는 방법은 이랬다.
//행 안에 들어갈 Data(Class 및 Struct)를 만든다.
//이때 [System.Serializable] 는 필수
[System.Serializable]
public class OnRewardObject
{
public bool isReward;
public GameObject[] RewardObject;
}
public class Stage : MonoBehaviour, IStageManager
{
public ObjectZone[] objectZone; //기믹리스트
public OnRewardObject[] RewardObjects; //기믹에 성공한경우 해당 오브젝트가 움직임
...
}
코드를 이렇게 작성시에
인스펙터에 이렇게 표현된다.
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2024-11-05(화) :: 물체가 계속 고정좌표로 이동하고 싶으면서 충돌 처리를 하고 싶을때 (예시 : 플레이어가 오브젝트를 잡은 상태를 구현할때)
이동발판을 이용하는 로직을 짤때 해당 발판의 자식으로 들어가 캐릭터를 같이 이동 시켰다.
MovePlatform .cs
private void OnCollisionEnter(Collision collision)
{
if (TargetLayerMask == (TargetLayerMask | 1 << collision.gameObject.layer))
{
collision.transform.SetParent(transform);
}
}
private void OnCollisionExit(Collision collision)
{
if (TargetLayerMask == (TargetLayerMask | 1 << collision.gameObject.layer))
{
collision.transform.SetParent(null);
}
}
이 코드는 충돌한 오브젝트를 검사해서 이동발판 오브젝트에 자식으로 설정해서 캐릭터와 이동발판이 같이 이동하는 로직으로 만들었다.
하지만 [Potal]게임처럼 물체를 잡고 움직이는 현상에 이와 같은 동작을 취했을때는 잡힌 물체의 Rigidbody로 인해 물리연산으로 인해 잡힌 물체가 원하는 위치에 있지 않았기에 키네마틱을 켜고 설정하였다.
하지만 키네마틱은 설정시에는 velocity나 force를 사용할순 있지만 외부의 물리충돌연산을 하지 않기에 다른 오브젝트들과의 충돌이 없어진게 문제였다.
물리충돌 연산은 필요하지만 , 잡힌 물체의 위치값이 계속 고정되어있기를 원했다.
튜터님께 질문해서 받은 답변은
<잡힌 물체의 좌표를 계속 갱신해줘야한다.> 였다.
방법 1. 잡힌 물체가 플레이어를 계속 따라다니게 하는 방법
방법 2. 잡힌 물체의 위치를 고정 좌표를 만든뒤 Player가 이동시 좌표를 갱신 하는 방법
두가지 방법이 있었다.
나는 방법1을 이용하여 그냥 고정좌표를 만들어주었고, 해당 좌표를 계속 갱신해주었다.
ObjectGrip.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.HID;
public class ObjectGrip : MonoBehaviour
{
[Header("Object Grip")]
public Transform GripPivotTr; //잡고있는 오브젝트의 위치
private bool isGrip; //오브젝트를 잡고있는상태
private GameObject target; //잡고있는 오브젝트의 정보
public LayerMask GripObjectLayerMask;
public float GripDistance = 3.0f;
//잡힌 물체의 좌표를 계속 갱신해줘야한다.
//이유 : 잡힌 물체의 물리 충돌연산을 해야되려면 잡힌 위치를 계속 갱신하고 키네마닉을 꺼야만 사용이 물리연산이 가능하기 때문
//방법 1. 잡힌 물체가 플레이어를 계속 따라다니게 하는 방법
//방법 2. 잡힌 물체의 위치를 고정 좌표를 만든뒤 Player가 이동시 좌표를 갱신 하는 방법
private void Update()
{
//방법 2. 잡힌 물체의 위치를 고정 좌표를 만든뒤 Player가 이동시 따라가게 하는 방법
if (isGrip)
{
target.transform.position = GripPivotTr.position + new Vector3 (0,1,0);
}
}
public void OnGrip(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Started)
{
if (!isGrip && target == null)
{
Ray ray = Camera.main.ScreenPointToRay(new Vector2(Screen.width / 2, Screen.height / 2));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, GripDistance, GripObjectLayerMask))
{
target = hit.transform.gameObject;
if(target.transform.TryGetComponent(out Rigidbody targetRigid))
{
targetRigid.freezeRotation = true;
}
isGrip = true;
}
}
else if (isGrip && target != null)
{
isGrip = false;
if (target.transform.TryGetComponent<Rigidbody>(out Rigidbody targetRigid))
{
targetRigid.freezeRotation = false;
}
target = null;
}
}
}
}
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2024-10-28(월) :: RigidBody.velocity 및 RigidBody.AddForce를 이용한 물리계산시 Time.deltaTime 및 Time.FixeddeltaTime을 연산하지 않는것이 좋다.
오늘 객체의 이동 및 점프를 RigidBody.velocity와 RigidBody.AddForce 메서드를 사용하여 구현 하였다.
void FixedUpdate()
{
Move();
}
public void Move()
{
moveDirection = curMoveInput.y * transform.forward + curMoveInput.x * transform.right;
moveDirection *= status.CurSpeed;
moveDirection.y = rigid.velocity.y;
rigid.velocity = moveDirection * Time.FixeddeltaTime;
}
이런식으로 구현을 하였다 하지만, 캐릭터의 이동 자체가 엄청 느린것이다. Speed 값을 100~200 단위는 올려야 좀 자연스럽고 , 점프도 내려올때 중력이 잘 적용되지만 아무리 무게값을 올려도 천천히 내려오는 현상이 반복됬다.
구글링 해본 결과
즉, RigidBody.velocity와 RigidBody.AddForce 는 내부적으로 이미 프레임간 시간 차이(deltaTime)를 적용하여 연산 처리 되어있기 때문에 한번더 곱해지면 값이 2번 보정되어 엄청 느려지는것이다.
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2024-11-06(수) :: Inspector에 2차원 배열 표시하기 (0) | 2024.11.06 |
---|---|
TIL : 2024-11-05(화) :: 물체가 계속 고정좌표로 이동하고 싶으면서 충돌 처리를 하고 싶을때 (예시 : 플레이어가 오브젝트를 잡은 상태를 구현할때) (0) | 2024.11.05 |
TIL : 2024-10-25(금) :: Unity3D에서 InputSystem을 사용하여 캐릭터 이동 및 카메라 회전 제어하기 (0) | 2024.10.25 |
TIL : 2024-10-24(목) :: SkyBox,Rigidbody.AddForce(),Ray 사용하는 방법 (0) | 2024.10.24 |
TIL : 2024-10-23(수) :: UnityEngine.Pool 사용하기 (0) | 2024.10.23 |
TIL : 2024-10-25(금) :: Unity3D에서 InputSystem을 사용하여 캐릭터 이동 및 카메라 회전 제어하기
오브젝트 조작 및 카메라 회전을 이해하기 위해 작성하였고
예전에 작성하던 제 스타일하고 달라서 나중에 필요할때 보려고 TIL로 작성하였습니다.
Unity3D :: 3D월드에서 InputSystem을 사용하여 캐릭터 이동 + 카메라 회전 , enum InputActionPhase
Q. Unity2D랑 Unity3D랑 나눌 정도로 InpuySystem이 많이 바껴?A.우선 Vector2 -> Vector3로 바뀌는 정도가 있긴하지만이동은 x축과 z축으로 이동하기에 비슷하게 동작한다. 내 개인 얘기가 들어가기에 이 질
01149.tistory.com