Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пожалуйста с кодом в Unity (новичок)

Межголоктический разум Ученик (144), открыт 4 недели назад
Объект должен двигаться влево||вправо с помощью мышки. Но не получается ограничить диапазон его передвижений.
Блоки с коллизией не работают из-за метода 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;
}
1 ответ
Katofan4ek Katofan4ek Профи (684) 4 недели назад
Проблема в вашем коде заключается в том, что вы используете координату 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 при движении.
Межголоктический разумУченик (144) 4 недели назад
Спасибо, но у меня игровой мир создан так что влево и вправо находятся по оси Z.
Использовав вами присланный код, объект движется только вперед
Katofan4ek Katofan4ekПрофи (684) 4 недели назад
попробуй заменить значения
Межголоктический разум Ученик (144) Katofan4ek Katofan4ek, НАКОНЕЦ-ТО ПОМОГЛО! большое СПАСИБО! 5 часов с этим мучился
Похожие вопросы