当前位置: 首页 > 知识库问答 >
问题:

统一,如何将相机切换到第二个对象的位置?

司空丰
2023-03-14

我在Unity 3D中遇到了一个奇怪的问题。我的想法是从阵列中找到距离玩家最近和第二最近的对象。然后我想让相机移动到最近的物体的位置,看着播放器,但是如果播放器和最近的物体之间的距离太小,我想让相机移动到第二个物体的位置。我做了一些编码,我不知道为什么else-if的第三部分甚至没有执行。当玩家离得太近时,相机不会切换,而是保持最近的物体位置。

public class Robot2 : MonoBehaviour
{
public GameObject cameraHolder;
public Transform[] objects;
private Transform nearestObj;

private Transform secondObj;
void Update()
{
    float lowestDist = 9999f;
    float secondLowestDist = lowestDist + 1f;
    float tooCloseDist = 3f;
    nearestObj = null;
    secondObj = null;
    
    foreach(Transform obj in objects)
    {
        float dist = Vector3.Distance(transform.position, obj.position);
        if(dist < lowestDist)
        {
            lowestDist = dist;
            nearestObj = obj;
            cameraHolder.transform.position = nearestObj.transform.position;      

        }
        else if(dist < secondLowestDist)
        {
            secondLowestDist = dist;
            secondObj = obj;

        }
        else if(dist < tooCloseDist)
        {
            Debug.Log("Too close , switching");
            cameraHolder.transform.position = secondObj.transform.position;
        }
    }
    Debug.DrawLine(transform.position, nearestObj.transform.position, Color.red);
}

}

共有1个答案

程卓君
2023-03-14

如果第二个对象也太近怎么办?

在使用和访问第一个和第二个最近的对象之前,为了获得更一般的解决方案,我将首先遍历整个阵列,看看是否真的没有更接近的对象。

您可以使用LinqOrderBy,并使用(transform.position-obj.position)作为标准。SQR幅度比使用幅度更便宜(这是矢量3.距离使用的)

using System.Linq;

...

[SerializeField] float tooCloseDist = 3f;

// Just a little helper struct, could also use a tuple 
// but this is probably easier to understand
private struct DistanceInfo
{
    public readonly Transform transform;
    public readonly float sqrDistance;

    public DistanceInfo(Transform self, Transform target)
    {
        transform = target;
        sqrDistance = (self.position - target.position).sqrMagnitude;
    }
}

private void Update ()
{
    // It's cheaper to use squared magnitude of vectors if it is only about comparing them
    var tooCloseDistanceSqr = tooCloseDistance * tooCloseDistance;

    // In one go for each object get according distance info instance
    // and order them starting with the smallest distance
    var orderedByDistance = objects.Select(obj => new DistanceInfo (transform, obj)).OrderBy(info => info.sqrDistance);

    // Go through the sorted instances of DistanceInfo
    foreach(var info in orderedByDistance)
    {
        // since we ordered by distance "info" is always the next closest object
        // if it is too close -> skip to the next closest one
        if(info.sqrDistance < tooCloseDistanceSqr) continue;
  
        // we found the next closest object that is not too close
        cameraHolder.transform.position = info.transform.position; 
        Debug.DrawLine(transform.position, info.transform.position, Color.red);
       
        // break the loop as we don't want to do anything further
        break;
    }
}
 类似资料:
  • 我在团结中挣扎。我想创建一个脚本,能够找到离玩家最近的对象(我设法做到了),以及离玩家第二近的对象。我的问题是如何修改此代码,使其也适用于第二个对象?

  • 我有两个java类如下 现在我有了一个A级对象Aobj,两个字段都已初始化。我用的是小豆子。copyProperties(Bobj,Aobj),但只有字段值被复制到Bobj中。名称列表为空。有没有办法深度复制一个对象,以便它复制所有字段,包括列表、地图等集合。 我在某个地方听说了推土机,不确定这是否是为了这个目的。

  • 假设我们有一个这样定义的对象A: 出于某种原因,我需要创建第二个对象B,它只具有对象A的前两个属性: 所以我的问题是:将对象A复制到对象B的最佳方法是什么?我一直在逐个复制获取者和设置者的属性,但有些事情告诉我一定有更好的方法来做到这一点!特别是当对象将具有很多属性时,我必须编写一行又一行的代码,只是为了将它们全部复制到第二个对象B... 多谢了:) 编辑:我一直被一个“另一个问题的可能重复”提醒

  • 在android中,我从这里得到一个图像对象https://inducesmile.com/android/android-camera2-api-example-tutorial/this camera tutorial。但我现在想要遍历像素值,有人知道我怎么做吗?我需要将它转换成其他的东西吗?我该怎么做? 谢谢

  • 我有Object1和Object2。现在,我想映射对象3,属性来自1 比方说,我有两个目标: 现在,有了这些,我想把它映射进去 哪里,first_name 现在,我的问题是,怎么做? 然而,目前,我正在这样做 但是,在这里,我必须在addressToView()中手动编写映射。 因此,有没有办法避免这种情况? 或者,处理此类情况的首选方式是什么?

  • 我正在写一个俄罗斯方块游戏。当应用程序启动Jlabel时,打开按钮“Play”。如何在现有的JFrame中切换到不同的标签(板)?