카메라 부분 입니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraManager : MonoBehaviour
{
[SerializeField] MovingAction _movingAction;
[SerializeField] Transform _target;
[SerializeField] float _rotSpeed;
public Vector3 offset { get; private set; }
bool _cameraMove = false;
bool _cameraRotate = false;
void Start()
{
offset = new Vector3(transform.position.x, transform.position.y, transform.position.z);
_movingAction._isFrontBackMoving += CameraMove;
_movingAction._isLeftRightMoving += CameraRotate;
}
void LateUpdate()
{
if (_cameraMove)
transform.position = _target.position + offset;
if (_cameraRotate)
transform.LookAt(_target);
}
void CameraMove()
{
_cameraMove = true;
}
void CameraRotate()
{
_cameraRotate = true;
}
}
------------------------------------------------------------------------------------------------------------
이동하는 부분입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static CustomPhysics;
using static ActorController;
public class MovingAction : BaseAction
{
[Header("Action Data")]
[SerializeField] float _runAniSpeed;
[SerializeField] float _moveSpeed;
[SerializeField] float _rotSpeed;
[SerializeField] float _rotateSpeed;
int _layerMask = (1 << 8);
float minAzimuth = 0.0f;
float maxAzimuth = 360f;
float _minAzimuth;
float _maxAzimuth;
float _azimuth = 0.0f;
float _radius;
public delegate void IsFrontBackMoving();
public event IsFrontBackMoving _isFrontBackMoving;
public delegate void IsLeftRightMoving();
public event IsLeftRightMoving _isLeftRightMoving;
[SerializeField] CameraManager _cameraManager;
public override void StartAction()
{
_minAzimuth = Mathf.Deg2Rad * minAzimuth;
_maxAzimuth = Mathf.Deg2Rad * maxAzimuth;
_radius = Vector3.Distance(Vector3.zero, _cameraManager.offset);
}
public override void UpdateAction()
{
_animator.SetFloat("Moving", Mathf.Min(1, _animator.GetFloat("Moving") + _runAniSpeed * Time.deltaTime));
}
void Moving(float moveDir, float moveDis)
{
if (moveDis * moveDis > Mathf.Epsilon)
{
Vector3 _moveDis = new Vector3(0.0f, 0.0f, moveDis).normalized;
//Debug.Log(moveDis);
_owner.transform.position = FixedMoveVector(_owner.transform.position, _moveDis * Time.fixedDeltaTime * _moveSpeed, _layerMask);
_owner.transform.rotation = Quaternion.Slerp(_owner.transform.rotation, Quaternion.LookRotation(_moveDis), Time.fixedDeltaTime * _rotSpeed);
_isFrontBackMoving();
}
if (moveDir * moveDir > Mathf.Epsilon)
{
Rotate(moveDir * Time.fixedDeltaTime * _rotateSpeed);
Vector3 pos = _owner.transform.position;
_owner.transform.position = SphericalCoordinates(pos);
_owner.transform.rotation = Quaternion.Slerp(_owner.transform.rotation, Quaternion.LookRotation(SphericalRotateCoordinates(pos, moveDir)), Time.fixedDeltaTime * _rotSpeed);
_isLeftRightMoving();
}
}
public Vector3 SphericalCoordinates(Vector3 _pos)
{
_pos.x = _radius * Mathf.Sin(_azimuth);
_pos.z = _radius * Mathf.Cos(_azimuth) - _radius;
Vector3 result = new Vector3(_pos.x, 0.0f, _pos.z);
return result;
}
public Vector3 SphericalRotateCoordinates(Vector3 _pos, float _moveDir)
{
_pos.x = _radius * Mathf.Sin(_azimuth);
_pos.z = _radius * Mathf.Cos(_azimuth) - _radius;
if (_moveDir > 0)
{
Vector3 resultRotate1 = new Vector3(_pos.z + _radius, 0.0f, -_pos.x);
return resultRotate1;
}
else
{
Vector3 resultRotate = new Vector3(-_pos.z - _radius, 0.0f, +_pos.x);
return resultRotate;
}
}
public void Rotate(float newAzimuth)
{
_azimuth += newAzimuth;
_azimuth = Mathf.Repeat(_azimuth, _maxAzimuth - _minAzimuth);
}
}
---------------------------------------------------------------------------------------
Moving 함수가 실제로 이동을 처리하는 곳이고 moveDir은 좌우 이동 값을 받고 moveDis는 위 아래 값을 받습니다
Vector3 forward = camera.메인.transformDirection(Vector3.포워드)
어디서 금지어설정이 되있어서 코드가 막히는지 모르겠네
forward.y = 0; forward = forward.normalized;
Vector3 right = new Vector3(forward.z, 0, -forward.x)
Vector3 direction = Input.GetAxis(Vertical) * forward + right * Input.GetAxis(Horizontal);
네 그 3개 코드가 상하 좌우 방향 코드죠? 근데 제 코드대로 하면 대각선에서 이상하게 움직여지던데 뭐가 문제인가요? ㅜ
transform.rotation = Quaterinon.LookRotaion(targetDirection)
transform.position += Vector3.포워드* speed * deltaTime 이런식으로 짜면 될꺼같음
지금 이동하는 함수 부분은 문제가 없는건가요?
저기 그리고 혹시 죄송한데요 이메일이나 오픈카톡 링크좀 주실 수 있나요? ㅜㅜ 제가 해보고 도저히 안되겠다 싶으면 물어보고 싶어서요 ㅜ
문제가 있음. 너가 입력값받아서 앞뒤랑 양옆이랑 transform.position에 두번 넣는게 문제인거 같음. 저런처리는 복사본을 만들어서 계산 다 마치고 마지막에한번에 처리해야함
오픈카톡은 사양하겠슴
rotation도 마찬가지임 여기까지
넵 정말 감사합니다! 좀 더 고민해볼게요
쉽게말해 너 코드에선 moveDir 처리가 moveDis 처리를 덮고있다는 말임
아 그것때문에 따로 따로 하면 작동하는데 같이 누르는 대각선 상황일때는 이상해지는거군요? 또 다른 문제는 없을까요?
아니면 너 코드가 FixedUpdate하고 Update사이에서 동작하는 코드일경우 라이프사이클때문에 코드가 꼬이는 걸수도 있음. 풀소스를 안봐서 모르겠지만 아무튼 이런거 예방하려면 한번에 처리하는게 제일 좋음
아 그러려면 카메라나 이동 하는 쪽이나 함수 하나로 다 처리하는게 좋겠네요
그건 아니야 카메라는 LateUpdate에서 처리해야함. 내말은 한개체의 오브젝트 이동을 말하는거임
아 이동쪽만 앞뒤 좌우를 한번에 처리하라구요?
채팅으로 대화하셔
https://hack.chat/?0g16uy0p