private void MovingWASD() 를 만들기 위해서는 Vector Spaces를 이해해야함
Vector란?
좌표계로 만든 공간
위치와 방향을 가진 개념
오로지 Vector로만 이루어져 있다고 함
같은 방향 벡터 더하기

다른 방향 벡터 더하기

벡터 빼기

순서바꾼 벡터 빼기

누구를 먼저 빼는냐에따른 교환결과가 다름
공간상에서 보면 a에서 b로 가능 방향과 거리를 표현

목적지 구하기
(목적지) - (현재위치) = 현재 위치에서 목적지까지의 방향과 거리
목적지좌표b(4,2) - 내위치a(1,-3) = c(1, -3)
내위치a에서 c벡터까지만 가면 b벡터 위치 나옴

벡터의 상등
위치가 달라도 길이와 방향이 같으면 같다고 봄
백터빼기 결과값은 벡터세계에서는 같은 거라고 함
스칼라란?
크기만 있고 방향이 없는 물리량, 방향성을 가지지 않는 성분
벡터에서 더하기 빼기 불가, 곱하기, 나누기 가능가능
내가 바라보는 방향의 길이를 더 멀리 갈 수 있음
ex) a벡터(2,3) * 3 = b(6,9)
스칼라곱
백터에 배수를 취하는 숫자를 곱할 수 있다면 스칼라곱이라고함
벡트의 크기는 늘리거나 줄이 수는 있어도 벡터의 방향은 변경 할 수 없음

(-3, 4) X 2 = (-3, 4 X 2) = (-6, 8)
벡터 곱하기 - 내적 외적
내적 (점 연산 dot product) - 각성분별로 곱한다음에 다 더하기
내적을 이용하면 어떤 두물체 사이의 각도가 얼마만큼 벌어졌는지 쉽게 파악 가능
1 은 바라보고 있는것, -1은 뒤돌아 있는 것
A벡터(x,y,z) . B벡터(x,y,z)
(Ax * Bx) + (Ay * By) + (Az * Bz) = 스칼라가 나옴(바라보는 방향)
A*B = |A| * |B| * cosX
|
내적 값
|
각도
|
의미
|
|
1
|
0도
|
같은방향(같은 방향 바라봄)
|
|
0
|
90도
|
서로 직각
|
|
-1
|
180도
|
반대방향(등돌린방향)
|

외적 (cross product) 3차원에서만 됨,
외적을하면 두 벡터의 수직의 값이 튀어나옴
ex 광원에 빛을 어느정도 받고 있는지 계산을 함
법선 벡터를 버텍스 1개 외적을 알면 광원과 내적하여 어느정도 밝기가 되는지 도출할 수 있음
A벡터(x,y,z) x0 B벡터(x,y,z)
x(Ay * Bz - Az * By) + y(Az * Bx - Ax * Bz) + z(Ax * By = Ay * Bx)
내적외적 표
|
항목
|
내적(Dot)
|
외적(Cross)
|
|
결과
|
숫자(float)
|
벡터(Vector3)
|
|
의미
|
방향의 유사도
|
수직 방향 계산
|
|
값 범위
|
-1 ~ 1
|
방향 + 크기
|
|
각도 관련
|
cos(θ) 사용
|
sin(θ) 사용
|
|
응용
|
시야 판정, 정면 감지
|
회전 축, 법선 벡터 구하기
|
|
순서 영향
|
없음 (A , B = B ,A)
|
있음 (A × B ≠ B × A)
|
|
Unity 함수
|
Vector3.Dot()
|
Vector3.Cross()
|
벡터의 길이 구하기( distance 함수있음)
원래 벡터에서 / 길이 = 정규화 nomalvector = 방향백터
정규화 nomalvector란? 방향은 똑같은데 길이가 1인것
내가 움직인다는것은? private void MovingWASD() 설명
시간에따라 위치값을 갱싱을 시키면됨
private void MovingWASD()
{
if (Input.GetKey(KeyCode.W) == true)
{
tr.position = tr.position + (Vector3.forward * moveSpeed * Time.deltaTime);
}
else if(Input.GetKey(KeyCode.S))
{
tr.position = tr.position + (Vector3.back * moveSpeed * Time.deltaTime);
}
}
현재 내 위치에서( tr.position) 한프레임마다 (Vector3.forward * moveSpeed * Time.deltaTime) 괄호안 만큼 더하겠다 임
1. tr.position
position의 자료형은 Vector3
2. Vector3.forward
Vector3.forward = forward(0,0,1)방향 벡터만큼 이동시킨다는 뜻
3.moveSpeed
속력을 조절해줌
[SerializeField] [Range(1f, 100f)] private float moveSpeed = 10f;
4.Time.deltaTime
가변프레임때문에 프레임이 컴퓨마다 다를 수 있기에 시간은 같아야 게임이 성립
한번 그리는데 걸리는 시간을 곱해줌
ex)
안좋은 컴퓨터는 4초동안 한프레임을 그리고
좋은 컴퓨터는 1초마다 한프레임이 보여지는데 20초가 걸리는 게임이라고 치면
안좋은 컴퓨터는 20초동안 5번 그려지고
좋은 컴퓨터는 20초동안 20번 그려질 수 있게됨
전체코드
using UnityEngine;
public class TransformExample : MonoBehaviour
{
private Transform tr = null;
// Velocity
[SerializeField, Range(1f, 100f)]
private float moveSpeed = 10f;
private void Awake()
{
Debug.Log("Awake: " + gameObject.name);
tr = gameObject.GetComponent<Transform>();
tr = GetComponent<Transform>();
tr = transform;
}
private void OnEnable()
{
Debug.Log("OnEnable");
}
private void Start()
{
Debug.Log(gameObject.name + " Move Speed: " + moveSpeed);
}
private void FixedUpdate()
{
//Debug.Log("FixedUpdate: " + Time.deltaTime);
}
private void Update()
{
//Debug.Log("Update: " + Time.deltaTime);
MovingWASD();
}
private void OnDisable()
{
Debug.Log("OnDisable");
}
private void MovingWASD()
{
if (Input.GetKey(KeyCode.W) == true)
{
tr.position =
tr.position +
(Vector3.forward * moveSpeed * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.S))
{
tr.position =
tr.position +
(Vector3.back * moveSpeed * Time.deltaTime);
}
}
}'유니티' 카테고리의 다른 글
| [유니티] 콜리전, 콜라이더, 트리거, 리지드바디 (0) | 2025.04.07 |
|---|---|
| [유니티] Controller Example (0) | 2025.04.04 |
| [유니티] Transform 만들기 -1 (0) | 2025.04.03 |
| [유니티] 라이프사이클 (0) | 2025.04.03 |
| [유니티] 유니티란? 프로그램, 3D구성요소 (0) | 2025.04.02 |