У меня есть следующий код, он работает, но я не знаю, как он работает.
void Update()
{
#if UNITY_ANDROID
if (Input.touchCount>0 && Input.GetTouch(0).phase == TouchPhase.Moved )
{
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
float offset = touchDeltaPosition.x * 40f / 18 * Mathf.Deg2Rad;
transform.position += new Vector3(0f, 0f, offset);
transform.position = new Vector3(0f, 0f, Mathf.Clamp(transform.position.z, -7.1f, 7.1f));
}
#endif
}
Мне нужно перемещать игрока по оси на ощупь, например, как в игре Cube Surfer!
Что я хочу получить (я использовал эмулятор Android):
Код, который я написал на основе ответов ниже, хорошо работает при разрешении 720x1280, но если установить разрешение 1440x2960, элементы управления становятся слишком резкими. Я знаю, почему это происходит, потому что touch.delta становится слишком большим.
Мой код:
if (Input.touchCount > 0)
{
var t = Input.GetTouch(0);
var delta = t.deltaPosition;
if (delta != Vector2.zero)
{
var offset = transform.position;
offset.x += delta.x * Sensitivity * Time.deltaTime;
offset.x = Mathf.Clamp(offset.x, -4f, 4f);
transform.position = offset;
}
}
Как это исправить?
ScreenToWorldPoint здесь не подходит, потому что игрок движется по сплайну.
Спасибо за помощь
Я предложу код, который намного проще и его легко понять
if (Input.touchCount > 0)
{
touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Moved)
{
transform.position = new Vector3(
transform.position.x + touch.deltaPosition.x * speedModifier,
transform.position.y,
transform.position.z);
}
}
Input.touchCount > 0
вы проверяете, есть ли касанияtouch = Input.GetTouch(0); if (touch.phase == TouchPhase.Moved)
вы проверяете, движется ли касание или перетаскиваетсяspeedModifier
— скорость движения.Если вы хотите попробовать это на своем компьютере, вам нужно сделать то же самое с raycast, но если вы подключите свой телефон к Unity, он будет работать так.
Вы можете легко переместить его по другой оси, просто добавив + touch.deltaPosition.x * speedModifier
Используйте этот код
Каждый кадр мы вычисляем дельта-движение вашего текущего касания и умножаем его на speed
(в течение периода времени, который является причиной умножения на Time.deltaTime
)
using System.Collections.Generic;
using UnityEngine;
public class BasicMovement : MonoBehaviour {
public float speed=5;
void Update () {
if (Input.touchCount>0 && Input.GetTouch(0).phase == TouchPhase.Moved )
{
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
float offset = touchDeltaPosition.x * speed * Time.deltaTime;
transform.position = new Vector3(0f, 0f, Mathf.Clamp(offset , -5f,5f));
}
}
}
Это работает хорошо, но если вы измените разрешение экрана на более высокое, он будет двигаться слишком быстро, как вы можете это исправить?
@AimonZ. просто разделите позицию x на (Screen.width) и увеличьте скорость float offset = (touchDeltaPosition.x/Screen.width) * speed * Time.deltaTime;
float worldWidth = 14f; //serialized, example value
float ratioScreenToWorld = 2.0f; //serialized, example value
float screenWidth = (float) Screen.width;
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Moved)
{
float horizontal = touch.deltaPosition.x;
transform.position +=
new Vector3(0f, 0f, horizontal * (worldWidth / screenWidth) * ratioScreenToWorld);
//clamp, or whatever
}
}
Корень ваших бед в том, что вы не нормализуете движение пальца до какого-то стандарта.
С помощью ratioScreenToWorld = 1f
этот код сопоставляет смещение пальца на экране со смещением объекта на пути. Ширина пути указана worldWidth
. При изменении ratioScreenToWorld
он перераспределяет это отображение, например. с ratioScreenToWorld = 0.5f
с точки зрения непрофессионала, «перемещение пальца по всему экрану перемещает объект на дороге / пути на половину ширины пути».
В каждом кадре мы вычисляем дельта-движение вашего текущего касания и умножаем его на скорость (в течение периода времени, который является причиной умножения на Time.deltaTime )
@AimonZ. если это было полезно, можете ли вы по-прежнему голосовать за ответ, даже если вы сняли зеленую галочку?