using System; using System.Collections.Generic; using UnityEngine; public class MoveObjectController : MonoBehaviour { public static MoveObjectController Instance; private ObjectMoveEnum moveType = ObjectMoveEnum.None; private GameObject movementObject; private float cameraZDistance; private Vector3 targetPosition; private bool isMove; private Vector3 offset; private Vector3 newWorldPosition; private Vector3 lastWorldCoordinats; private Vector3 lastMovePosition; private Quaternion lastRotation = Quaternion.identity; private Vector3 directionMove = Vector3.zero; private bool objectMove; private ParentObject parentObject; public bool IsListenLastPosition { get; set; } = true; public void Awake() { if (Instance == null) { Instance = this; } } public void SetMoveType(ObjectMoveEnum type, GameObject currentObject) { moveType = type; movementObject = currentObject; parentObject = currentObject.GetComponentInChildren(); lastWorldCoordinats = movementObject.transform.position; lastMovePosition = movementObject.transform.position; lastRotation = movementObject.transform.rotation; } public void ResetMoveType() { moveType = ObjectMoveEnum.None; movementObject = null; isMove = false; } public void ReturnToLastPos(Vector3 lastPos) { movementObject.transform.position = lastPos; movementObject.transform.rotation = lastRotation; } public Vector3 GetLastPosition() { return lastMovePosition; } private void FixedUpdate() { switch (moveType) { case ObjectMoveEnum.None: return; case ObjectMoveEnum.LeftRight: MoveLeftRight(); break; case ObjectMoveEnum.RotateX: case ObjectMoveEnum.RotateY: RotateXY(); break; case ObjectMoveEnum.UpDown: MoveUpDown(); break; } } private void MoveLeftRight() { cameraZDistance = Camera.main.WorldToScreenPoint(movementObject.transform.position).z; Vector3 screenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cameraZDistance); newWorldPosition = Camera.main.ScreenToWorldPoint(screenPosition); if (!isMove) { offset = movementObject.transform.position - newWorldPosition; isMove = true; } offset.y = 0; directionMove = (newWorldPosition - lastWorldCoordinats).normalized; directionMove.y = 0; float distanceToMove = Vector3.Distance(lastWorldCoordinats, newWorldPosition); Vector3 targetPosition = new Vector3(newWorldPosition.x, movementObject.transform.position.y, newWorldPosition.z) + offset; if (Physics.Raycast(movementObject.transform.position, directionMove, out RaycastHit hit, distanceToMove)) { targetPosition = hit.point; } parentObject.MoveObject((targetPosition - movementObject.transform.position) / Time.deltaTime); // parentObject.MoveObject((targetPosition - movementObject.transform.position) / Time.deltaTime); lastWorldCoordinats = newWorldPosition; } private void RotateXY() { float axisX = Input.GetAxis("Mouse X"); float axisY = Input.GetAxis("Mouse Y"); if (moveType == ObjectMoveEnum.RotateX) { movementObject.transform.eulerAngles += new Vector3(0, axisX * 10, 0); } else if (moveType == ObjectMoveEnum.RotateY) { movementObject.transform.eulerAngles += new Vector3(axisY * 10, 0, 0); } } public void MoveUpDown() { float axisY = Input.GetAxis("Mouse Y"); float posY = movementObject.transform.position.y; if (posY <= 0 && axisY <= 0) { movementObject.transform.position = new Vector3(movementObject.transform.position.x, 0, movementObject.transform.position.z); return; } movementObject.transform.position += new Vector3(0, axisY / 2, 0); } }