У меня есть сфера с именем Pointer, которая может перемещаться везде с помощью transform.Translate(). но я хочу, чтобы эта сфера могла двигаться только внутри полусферы с именем LimitSphere, я не знаю, как это сделать.
я уже пытался использовать Mathf.Clamp, но, как вы можете видеть на этом изображении

но когда я ставлю вписанный квадрат, я теряю слишком много места (желтый)
и когда я устанавливаю описанный квадрат, слишком много места вне круга (фиолетовый/розовый)
Так есть ли решение ограничить движение внутри сферы?
РЕДАКТИРОВАТЬ : Это мой реальный код:
using UnityEngine;
using System.Collections;
public class TranslationClavier : MonoBehaviour {
public float vitesse_translation = 1.0f;
void Update () {
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(Vector3.up * vitesse_translation * Time.deltaTime);
}
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(Vector3.down * vitesse_translation * Time.deltaTime);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(Vector3.right * vitesse_translation * Time.deltaTime);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(Vector3.left * vitesse_translation * Time.deltaTime);
}
if (Input.GetKey(KeyCode.I))
{
transform.Translate(Vector3.forward * vitesse_translation * Time.deltaTime);
}
if (Input.GetKey(KeyCode.K))
{
transform.Translate(-Vector3.forward * vitesse_translation * Time.deltaTime);
}
}
}
под ним видна моя маленькая сфера, и я хочу зажать ее внутри большого сферического коллайдера





Это очень просто. Сначала вам нужно знать расстояние, на которое вы собираетесь отправиться, от центра сферы, поэтому вы делаете это в два этапа. Предполагая, что вы вызываете его из преобразования, которое является родительским для сферы, вы можете сделать:
Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);
Это сделает перевод только в том случае, если пункт назначения находится внутри сферы. Какие бы другие условия (например, ограничение полусферы) вам не понадобились — вы можете проанализировать newnewPosition. Если вы хотите всегда двигаться, но ограничиваете величину движения, вы можете использовать тот факт, что вы можете разделить векторы на направление и величину и собрать их заново, например
if (newPosition.magnitude>sphereRadius)
newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
что такое «мояДельта»?
myDelta должны быть присвоены значения в зависимости от кодов клавиш, т.е. Vector3.left * vitesse_translation * Time.deltaTime, сохраните его во временной переменной перед переводом
не могли бы вы привести пример того, как применить ваш код на моем
заменить каждый transform.Translate(Vector3.forward * vitesse_translation * Time.deltaTime); с myDelta=Vector3.forward * vitesse_translation *Time.deltaTime (объявите его ранее как Vector3 myDelta=Vector3.zero), затем вставьте мой код
это не работает, моя подвижная сфера никогда не останавливается, даже если я отпускаю ввод
я обнаружил, что answer.unity.com/questions/1309521/… это именно то, что я хочу
я наконец сделал это
// Get the new position for the object.
Vector3 movement = new Vector3(Input.GetAxis("Vertical"), Input.GetAxis("VerticalJD"), Input.GetAxis("Horizontal")) * vitesse_translation;
Vector3 newPos = transform.position + movement;
// Calculate the distance of the new position from the center point. Keep the direction
// the same but clamp the length to the specified radius.
Vector3 offset = newPos - centerPt;
transform.position = (centerPt + Vector3.ClampMagnitude(offset, radius));
спасибо за ваш ответ, но я новичок в Unity и не уверен, что хорошо понимаю, как применить ваш код к моему