Unity3d 如何在球体内限制transform.translate

Unity3d 如何在球体内限制transform.translate,unity3d,transform,limit,Unity3d,Transform,Limit,我有一个名为指针的球体,它可以通过transform.Translate()移动到任何地方 但是我想这个球体只能在一个叫做LimitSphere的半球内移动,我不知道怎么做 我已经尝试过使用Mathf.Clamp,但正如你在这张图片上看到的那样 但是当我设置一个内接正方形时,我释放了太多的空间(黄色) 当我设置一个外切正方形时,圆圈外的空间太大(紫色/粉色) 那个么,有并没有办法限制球体内部的运动呢 编辑: 这是我的实际代码: using UnityEngine; using System.C

我有一个名为指针的球体,它可以通过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);
            }
    }

}

下面你可以看到我的小球体,我想把她夹在大球体对撞机里

这很容易。 首先,你需要知道你将要到达的距离,从球体的中心开始,所以你分两步来做。假设您是从作为球体父对象的transfrom调用它,您可以执行以下操作:

Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);
这将仅在目标位于球体内时进行转换。 无论您需要执行什么其他条件(如半球约束),都可以分析新位置。如果希望始终移动,但限制movemnet的大小,可以使用这样一个事实,即可以将向量拆分为方向和大小,然后重新组合它们

if (newPosition.magnitude>sphereRadius)  
      newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
if(新位置.幅值>球体半径)
新位置=新位置。方向*球体半径//将夹紧球体
如果(newPosition.y我终于做到了

    // 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新手,我不知道如何在我的电脑上应用你的代码什么是“myDelta”?myDelta应该根据键码分配值,例如Vector3.left*vitesse_translation*Time.deltaTime,在翻译之前将其存储在一个临时变量中。你能给我一个如何使用的示例吗在MinerPlace上应用代码替换每个transform.Translate(Vector3.forward*vitesse\u translation*Time.deltaTime);使用myDelta=Vector3.forward*vitesse\u translation*Time.deltaTime(之前声明为Vector3 myDelta=Vector3.zero),然后粘贴我的代码