Vector
스칼라
Rigdbody (컴포넌트)
유니티에서 중요한 것 2가지라고하면
Enemy
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player_Finder : MonoBehaviour
{
[SerializeField] //public과 사용하는 목적이 같은데
Transform playerT;
private void Start()
{
}
private void Update()
{
var offsetRot = 180f;
// 1. 내 위치와 플레이어의 위치로 결과 벡터를 얻는다.
var resultVec = playerT.position - transform.position;
resultVec.Normalize();
// 2. 내 앞벡터와 내적해서 회전할지말지 결정한다.
var dot = Vector3.Dot(resultVec, transform.forward);
if(Mathf.Abs(dot) > 0.001f)
{
// 3. 내 우벡터와 내적해서 우회전인지 좌회전인지 결정한다.
var dot2 = Vector3.Dot(resultVec, transform.right);
//오른쪽에 있다. 복합연산자, 삼항연산자
offsetRot *= dot2 >= 0 ? 1 : -1;
// 4. 최종 회전 (Time.deltaTime은 초당변화량을 일정하게 유지한다.)
transform.Rotate(0, offsetRot * Time.deltaTime, 0);
}
}
}
Player
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player_Con : MonoBehaviour
{
[SerializeField]
float movespeed = 3f;
[SerializeField]
float rotSpeed = 360f;
[SerializeField]
float velPower = 0.9f;
float velocity = 0;
void Start()
{
}
// Update is called once per frame
void Update()
{
var h = Input.GetAxis("Horizontal");
var v = Input.GetAxis("Vertical");
//Axis는 0부터 1까지 점점올라갔다가 내려감. -1이라도 같음
//GetAxisRaw를 쓰면 뚝뚝 끊긴다.
if (v != 0)
{
velocity += v * Time.deltaTime;
}
else
{
//키를 누르지않으면 변위가 0이 되도록 감속한다.
velocity -= velocity * velPower * Time.deltaTime;
}
transform.position += transform.forward * v * velocity * movespeed * Time.deltaTime;
transform.Rotate(0, h * rotSpeed * Time.deltaTime, 0);
}
}