C# 用偏移量移动到目标

C# 用偏移量移动到目标,c#,unity3d,transform,C#,Unity3d,Transform,我正在尝试将相机移动到具有指定偏移量的已单击游戏对象位置。因此,脚本应该通过单击的gameobjects位置、实际相机位置和偏移量来计算结果位置 我已使用以下代码进行了尝试: Vector3 distanceVector = transform.position - target.transform.position; Vector3 distanceVectorNormalized = distanceVector.normalized; targetPosition = (distanceV

我正在尝试将相机移动到具有指定偏移量的已单击游戏对象位置。因此,脚本应该通过单击的gameobjects位置、实际相机位置和偏移量来计算结果位置

我已使用以下代码进行了尝试:

Vector3 distanceVector = transform.position - target.transform.position;
Vector3 distanceVectorNormalized = distanceVector.normalized;
targetPosition = (distanceVectorNormalized * preferredDistance);
但我得到了一些非常奇怪的值。以下是我为此编写的代码:

public float moveSpeed = 0.1f;

private bool moving = false;
private GameObject target;

// The distance between the camera and the targets position
private float preferredDistance = 3;

// The position the camera will move to
private Vector3 targetPosition;

// Start is called before the first frame update
void Start()
{
}

// Update is called once per frame
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out var hit, 100) == false) return;

        Debug.Log(hit.transform.gameObject.name);
        target = hit.transform.gameObject;

        ... Here should be the calculations

        moving = true;
    }

    if (moving)
    {
        transform.position = Vector3.Lerp(transform.position, targetPosition, moveSpeed);
        transform.LookAt(target.transform.position);

        var offsetX = Math.Abs(transform.position.x - targetPosition.x);
        var offsetZ = Math.Abs(transform.position.z - targetPosition.z);

        if (offsetX < .01
            && offsetZ < .01) moving = false;
    }
}
public float moveSpeed=0.1f;
私有布尔移动=假;
私有游戏对象目标;
//相机和目标位置之间的距离
私有浮动优先距离=3;
//相机将移动到的位置
专用矢量3目标位置;
//在第一帧更新之前调用Start
void Start()
{
}
//每帧调用一次更新
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
var-ray=Camera.main.screenpointoray(Input.mousePosition);
if(Physics.Raycast(光线,out-var-hit,100)=false)返回;
Log(hit.transform.gameObject.name);
target=hit.transform.gameObject;
…这应该是计算结果
移动=真;
}
如果(移动)
{
transform.position=Vector3.Lerp(transform.position,targetPosition,moveSpeed);
变换。注视(目标。变换。位置);
var offsetX=数学Abs(transform.position.x-targetPosition.x);
var offsetZ=Math.Abs(transform.position.z-targetPosition.z);
如果(抵销x<.01
&&偏移量z<0.01)移动=假;
}
}

标准化的
距离向量
充当摄影机指向对象的方向。 这个方向应该是标准化的,你可以这样做,所以它可以乘以你的
首选距离。然后,它将成为摄影机与目标的偏移量

出现错误的部分是,您将此规格化偏移设置为新的摄影机位置,但应将其添加到其中:

Vector3 distanceVector = transform.position - target.transform.position;
Vector3 distanceVectorNormalized = distanceVector.normalized;
targetPosition = target.transform.position + (distanceVectorNormalized * preferredDistance);
注意最后一行中的差异