Unity-13: 마우스를 이용한 이동/회전
- GameObject 밑에 Cylinder밑에 cube생성
- MoveControl Script 생성
물체이동 (순간이동)
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
transform.position = rHit.point;
}
}
}
물체이동 (천천히 이동)
public float _moveSpeed = 10; //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
Vector3 _goalPosition;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
}
}
if((_goalPosition - transform.position).magnitude >= 0.1f)
transform.position += (_goalPosition - transform.position).normalized * _moveSpeed * Time.deltaTime;
// (목표지점 - 내지점)을 normalized하면 방향만 남고, 속도를 곱해준다음, 프레임당 걸린시간(이전
프레임부터 지금프레임까지)을 곱함
else
transform.position = _goalPosition;
}
- a포인트에서 b포인트로 이동하는 물체에는
b로갔다는 방향(좌표)과,
어느정도 빠르기로 간다는 속도와,
얼마나걸렸는지에 대한 시간의 요소들이 작용함
Vector3.MoveToword
- 내 위치와 목적지를 이용하여 속도값을 적용하여 이번 프레임에 도착해야할 위치를 얻어오는 명령
transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
- 내 위치와 목표위치 , 스피드, 이번프레임에 움직여야할 시간을 입력하면 됨
public float _moveSpeed = 10;
Vector3 _goalPosition;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
}
}
transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
}
}
방향전환1
public float _moveSpeed = 10; //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
Vector3 _goalPosition;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
transform.LookAt(_goalPosition);
}
}
transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
}
transform.LookAt(_goalPosition)
_goalPosition
방향으로 바라봄
방향전환 2
public float _moveSpeed = 10; //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
public float _rotSpeed = 120; // 회전속도
Vector3 _goalPosition;
Quaternion _goalRotation;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
_goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
//목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
//normalized는 자동으로 됨
transform.rotation = _goalRotation;
}
}
transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
}
- 목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
- normalized는 내부에서 자동으로 됨
회전하는 모습 보이게 하기
Quaternion.RotateToword
(내위치, 목표위치, 속도*이번프레임에 움직여야할 시간)- 내 현재방향과 바라봐야 하는 방향을 이용하여 회전속도값을 적용하여 이번 프레임에 움직여야 할 라디안 값을 얻어오는 명령
public float _moveSpeed = 10; //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
public float _rotSpeed = 120; // 회전속도
Vector3 _goalPosition;
Quaternion _goalRotation;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
_goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
//목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
//normalized는 자동으로 됨
}
}
transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
transform.rotation = Quaternion.RotateTowards(transform.rotation, _goalRotation, _rotSpeed * Time.deltaTime);
}
빠르게 이동(회전)하다가 천천히 이동(회전) / Lerp(Slerp)
public float _moveSpeed = 10; //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
public float _rotSpeed = 120; // 회전속도
Vector3 _goalPosition;
Quaternion _goalRotation;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit rHit;
int lMask = 1 << LayerMask.NameToLayer("Floor");
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
{
_goalPosition = rHit.point;
_goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
//목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
//normalized는 자동으로 됨
}
}
transform.position = Vector3.Lerp(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
transform.rotation = Quaternion.Slerp(transform.rotation, _goalRotation, _rotSpeed * Time.deltaTime);
}
- 일반적으로는 ToWards를 사용
- 기믹들은 Lerp(Slerp) 사용
댓글남기기