Katofan4ek Katofan4ek
Профи
(764)
6 месяцев назад
Проблема в вашем коде заключается в том, что вы используете координату Z для определения новой позиции объекта, вместо координаты X, которая в данном случае соответствует горизонтальному движению объекта влево и вправо. Вы также неправильно применяете координату Z в методе Mathf.Clamp(), который приводит к телепортации объекта.
Вот исправленный код для движения объекта влево и вправо с помощью мыши в диапазоне от minX до maxX:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMouse : MonoBehaviour
{
private Vector3 mouseStartPosition;
private Transform objectToMove;
public float playerSpeed = 10f;
private float minX = -6.9f;
private float maxX = 10.3f;
void Start()
{
objectToMove = this.transform;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
mouseStartPosition = Input.mousePosition;
}
else if (Input.GetMouseButton(0))
{
Vector3 mouseDiff = Input.mousePosition - mouseStartPosition;
float deltaX = mouseDiff.x / Screen.width;
float newXPosition = Mathf.Clamp(objectToMove.position.x + deltaX, minX, maxX);
Vector3 newPos = new Vector3(newXPosition, objectToMove.position.y, objectToMove.position.z);
objectToMove.position = Vector3.Lerp(objectToMove.position, newPos, playerSpeed * Time.deltaTime);
}
}
}
В этом исправленном коде используется координата X для изменения позиции объекта влево и вправо, а метод Mathf.Clamp() применяется к координате X. Теперь ваш объект должен остаться в заданном диапазоне minX - maxX при движении.
Межголоктический разумУченик (193)
6 месяцев назад
Спасибо, но у меня игровой мир создан так что влево и вправо находятся по оси Z.
Использовав вами присланный код, объект движется только вперед
Блоки с коллизией не работают из-за метода Update (просто проходить через них). Решил использовать метод Mathf.Clamp() но объект телепортирует куда подальше
Код:
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
public class PlayerMous : MonoBehaviour
{
private Vector3 mouseStartPosition;
private Transform objectToMove;
public float playerSpeed = 10f;
private float minX = -6.9f;
private float maxX = 10.3f;
void Start()
{
objectToMove = this.transform;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
mouseStartPosition = Input.mousePosition;
}
else if (Input.GetMouseButton(0))
{
Vector3 mouseDiff = Input.mousePosition - mouseStartPosition;
float deltaZ = mouseDiff.x / Screen.height;
float newXPosition = Mathf.Clamp(objectToMove.position.z + deltaZ, minX, maxX);
Vector3 newPos = objectToMove.position + new Vector3(0, 0, newXPosition) * Time.deltaTime * playerSpeed;
objectToMove.position = newPos;
}