Unity,如何将相机切换到第二个物体的位置?

2024-04-12

我在 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);
}

}


如果第二个物体也太近怎么办?

对于使用和访问第一个和第二个最接近的对象之前的更通用的解决方案,我将首先遍历整个数组,看看是否真的没有更接近的对象。

你可以使用Linq OrderBy https://learn.microsoft.com/dotnet/api/system.linq.enumerable.orderby并作为标准使用(transform.position - obj.position).sqrMagnitude这比使用便宜magnitude(这是什么Vector3.Distance正在使用)

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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity,如何将相机切换到第二个物体的位置? 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 如何使用 Python 和 Pillow 将此索引 PNG 转换为灰度并保持透明度?

    我正在尝试使用 Python Pillow 将图像转换为灰度 我在大多数图像中都没有遇到困难 但是 在使用不同图像进行测试时 我发现了 BeeWare 项目中的这个徽标 我知道它已使用某些图像编辑器进行了进一步编辑 并使用 ImageOpt
  • 使用preparedStatement查询速度较慢,但​​使用executeQuery查询则不然

    我在 Grails 应用程序访问数据时遇到了一个奇怪的问题 更深入地说 我使用PreparedStatement executeQuery 与Statement executeQuery 将问题隔离到一个普通的java8 小型应用程序 考虑
  • 读取串行数据而不需要高 CPU 使用率

    我想在 Linux 下用简单的 C 或 C 程序读取通过 FTDI 串行 接口从 Arduino 发送的消息 Arduino 发送两个字符的 标头 一个命令字节 后跟几个字节的数据 具体取决于命令 我的第一次尝试是简单地使用 open 和
  • 无法在字符串“__zone_symbol__optimizedZoneEventTask”上创建属性“__creationTrace__”

    这是一个糟糕的星期四 这是第 13 号 昨天我向我的同事们解释了我们是多么幸运 13 日是在星期四 而不是星期五 好吧 那是昨天的事 今天我醒来时 阿格的拳头打在我脸上 无法创建属性 创作轨迹 在字符串 zone symbol optimi
  • PHP IMAP 推送电子邮件通知到 iPhone

    我正在编写一个 PHP 脚本 该脚本通过 IMAP 定期检查用户收件箱中是否有新消息 该脚本与 IMAP 服务器保持开放连接 并每 5 秒获取最新消息的 UID 如果 UID 大于最初记录的比较 UID 脚本会向用户的 iPhone 发送推
  • Python:使用 Win32 COM Api 打开 Excel 工作簿

    我使用以下代码在 Excel 中打开并显示工作簿 import win32com client as win32 excel win32 gencache EnsureDispatch Excel Application wb excel
  • Android 电视 - 现在玩纸牌图标

    我目前正在开发一个 Android 电视应用程序 但无法弄清楚如何更改当我在播放视频时离开该应用程序时出现的当前播放卡的图标 This link https developer android com training tv playbac
  • 带有对象输入数组的 Angular 2 形式

    我正在构建一个发票应用程序来学习 Angular2 我遇到的问题是如何构建行项目组件 其中一行包含 3 个输入 这些输入应来自并绑定到行项目数组中的对象 在角度1中 我可以通过添加一个轻松实现这一点ng form指向输入容器的指令 这里相当
  • 处理日期时间格式的“+00:00”

    如何将 2020 06 30 15 20 13 078196 00 00 形式的日期列转换为 pandas 中的日期时间 这就是我所做的 pd concat df df date string apply lambda s pd Serie
  • ASP.NET 如何将文件流式传输给用户

    最初 我试图找出 Response Close 和 Response End 之间的区别 但经过更多谷歌搜索和研究后 很明显我没有看到 Byte 发送回客户端的常见方式 我将在下面留下代码示例 但我想知道执行此操作的行业标准是什么 Byte
  • 通过 qbXML 设置 Employee 的 IsActive

    使用 QbXml 添加或修改员工时出现以下错误 QuickBooks 在解析提供的 XML 文本流时发现错误 我尝试过 true false 这是它返回的值 yes no 和 1 0 这些似乎都不起作用 是否可以为员工设置 IsActive
  • 我怎样才能完成反应日期

    我正在创建消息列表 显示消息发送的时间 这是我的留言集 Messages new Mongo Collection messages Messages attachSchema new SimpleSchema created type D
  • 如果字符串包含列表中的元素,则创建新的条件列[重复]

    这个问题在这里已经有答案了 我正在尝试添加一个新列keywords这将得到价值TRUE如果该单词出现在关键字列表中 该值将是FALSE如果该词没有出现在keywordslist 我的关键字由 100 多个单词组成 因此无法手动添加单词 关键
  • Mongo Java 驱动程序不遵守 limit 方法

    我有这个查询 DBCursor mongoCursor mongoCollection find query sort sort limit 5000 long mongoCursorCount mongoCursor count myLo
  • 如何创建并推送到共享或分布式数组数组?

    我编写了 Julia 代码 其中初始化一个空数组 如下所示 a 稍后在代码中 我简单地推送到该数组 如下所示 推 a b 其中 b c d e 是另一个数组 每个 b 可以具有不同的长度 这在非并行化代码中工作得很好 但是 我想在并行代码中
  • Java 垃圾收集,将引用设置为 null

    public class A A a public static void main String args A b new A new object created obj1 b a new A new object created ob
  • 使用 Werkzeug 和 Jinja2 的上下文处理器

    我的应用程序在 App Engine 上运行并使用Werkzeug http werkzeug pocoo org and Jinja2 http jinja pocoo org 2 我想要一个功能上与 Django 自己的上下文处理器等效
  • 尝试调用未定义的函数 glutInit

    我需要 python 中的一个过剩窗口 我使用 Python 3 5 和 PyOpenGL GLUT 时出现以下异常 Traceback most recent call last File D Test py line 47 in
  • Firestore没有执行操作的权限

    我正在尝试在 Firestore 中设置规则 如果每个人都经过身份验证进入应用程序 则每个人都可以读取彼此的内容 但只有文档所有者才能创建 写入 更新或删除它们 我在 Firestore 中设置了以下规则 rules version 2 s
  • Unity,如何将相机切换到第二个物体的位置?

    我在 Unity 3D 中遇到奇怪的问题 我的想法是找到数组中距离玩家最近和第二近的对象 然后我希望相机移动到最近的物体的位置并看着玩家 但如果玩家和最近的物体之间的距离太小 我希望相机移动到第二个物体的位置 我做了一些编码 但我不知道为什