반응형
Vector3.Cross(_col.transform.right, distVec).z
[게임이론]벡터의 외적에서 학습한 내용을 Unity에서 간단히 적용해본다.
시나리오
수퍼마리오가 점프로 벽돌을 깨는 행위와 벽돌 위로 올라가는 것 구현한다. 벽돌 시점에서 마리오가 아래 방향에서 점프를 했는지 위에서 점프해서 내려왔는지 판단해야한다. 이때 벡터의 외적 내용을 바탕으로 위-아래를 판단할 수 있다.
점프시에 노란색 오브젝트와 충돌하면 디버그 로그로 Up, Down이 출력된다.
1. 플레이어 객체에서 충돌 객체의 벡터를 구한다.
Vector3 distVec = transform.position - _col.transform.position;
2. (1)의 결과로 도출된 distVec와 충돌 객체의 외적을 구한다. 이때 Vector3.Cross 함수를 이용한다.
Vector3.Cross(_col.transform.right, distVec)
3, 2D게임의 경우 외적 결과 값의 z값의 음수, 양수 값에 따라 위/아래가 결정된다.
아래 그림에서 검적색 선이 충돌 객체의 벡터 (_col.transform.right)이고 녹색 선이 distVect라고 가정할 때 외적-오른손의 법칙을 적용해보면, 오른손은 반시계 방향이며, 엄지는 화면 밖으로 나오는 방향이다. 즉, 이는 외적 결과 값의 z성분이 양수이며, 충돌객체의 위로 부딧혔음을 나타낸다.
반대로 오른손 법칙을 적용했을 때, 오른손이 시계방향이고 엄지가 화면 안쪽으로 들어가는 방향이면 z성분이 음수이며, 이는 충돌객체의 아래로 부딧힌 것이다.
다음의 코드는 적용된 전체 소스코드이다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WarriorController : MonoBehaviour
{
private Rigidbody2D warriorRigidbody2D;
public float jumpPower;
public float speed;
void Start()
{
warriorRigidbody2D = GetComponent<Rigidbody2D>();
}
void Update()
{
PlayerMove(); // 플레이어의 이동 함수
PlayerJump(); // 플레이어의 점프 함수
}
void PlayerMove()
{
// 조이스틱 입력에서 X축만 입력 사용
float x = Input.GetAxis("Horizontal");
// Vector3.right VS transform.right
transform.Translate(Vector3.right * (x * speed * Time.deltaTime));
}
void PlayerJump()
{
// 스페이스 키를 눌렀을때
if (Input.GetKeyDown(KeyCode.Space))
{
// 힘을 위쪽 방향으로 jumpPower만큼 줌. 타입은 impulse(순간적인 힘)
warriorRigidbody2D.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
}
}
private void OnCollisionEnter2D(Collision2D _col)
{
// 부딧힌 충돌체의 태그가 Ground가 아닐때만 수행
if (_col.gameObject.tag != "Ground")
{
UpOrDown(_col);
}
}
void UpOrDown(Collision2D _col)
{
// Warrior pos - Wall pos
// 벽에서 전사 방향의 벡터를 만든다.
// _col.transform.right 충돌체의 오른쪽 방향 벡터
// 오른손 법칙 - 반시계방향. 화면에서 밖으로 나오는 방향 -> 양수 -> 병의 위에 부딧힌 것.
// 시계방향 - 화면으로 들어가는 방향 -> 음수 -> 벽의 아래에 부딧힌 것.
Vector3 distVec = transform.position - _col.transform.position;
if (Vector3.Cross(_col.transform.right, distVec).z > 0)
{
Debug.Log("Up");
return;
}
Debug.Log("Down");
}
}
반응형
'프로그래밍 이야기 > GameDev' 카테고리의 다른 글
[게임이론] 힘과 가속도 (0) | 2021.01.10 |
---|---|
[게임이론] 행렬 (0) | 2021.01.02 |
[게임이론]벡터의 외적 (0) | 2020.12.28 |
[게임이론] 백터의 내적 (0) | 2020.12.24 |
[게임이론] Vector의 활용 (0) | 2020.12.21 |