尝试让一个对象查看 Unity 中的另一个对象

2024-03-26

嗨,我一直在尝试让对象“Tower”查看对象“Enemy”,但是我收到错误“非静态字段、方法或属性“Enemy.position”需要对象引用” ”

这是敌人的类,我试图在其中定义敌人的位置以供塔参考。

有谁知道如何解决这个问题?谢谢

public class Enemy : MonoBehaviour {

public float speed = 1.5f;
public Vector3 position;

private Vector3 target;

void Start()
{
    target = transform.position;
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        target.z = transform.position.z;
    }
    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);

    position = GameObject.Find("enemy").transform.position;
}

}

这是塔的类,其中“varlookPos=Enemy.position-transform.position;”导致错误。

public class Tower : MonoBehaviour {

public GameObject towerPrefab;
public float speed = 1f;

private bool canPlaceTower()
{
    return tower == null;
}


private GameObject tower;

// Use this for initialization
void Start()
{

}

void Update()
{
    var lookPos = Enemy.position - transform.position;
    lookPos.y = 0;
    var rotation = Quaternion.LookRotation(lookPos);
    transform.rotation = Quaternion.Lerp(transform.rotation, rotation, speed * Time.time);
    transform.Rotate(0, -90, 0);
}
}

非静态字段、方法或属性“Enemy.position”需要对象引用

这是因为position in Enemy is not static.

相反,你可以这样做:

class Tower
{
    public Enemy Victim;

    /// ...
}

你会分配Victim in the 督察那么你会用它来代替你的Enemy.position但是,由于需要手动分配,这种方法受到限制。

替代解决方案:

塔中的独特脚本

  • 搜索标记的对象Player
  • 查看找到的第一个(如果有)

Code:

using System.Linq;
using UnityEngine;

public class Tower : MonoBehaviour
{
    private void Update()
    {
        var objects = GameObject.FindGameObjectsWithTag("Player");
        if (!objects.Any())
            return;

        var target = objects.First();
        if (target == null)
            return;

        var p1 = transform.position;
        var p2 = target.transform.position;
        var position = new Vector3(p2.x, p1.y, p2.z); // does not bend to target
        transform.LookAt(position);
    }
}

这很简单,相反你可以做一些更好的事情,比如如果有很多玩家,选择离塔最近的一个:

private void Update()
{
    var objects = GameObject.FindGameObjectsWithTag("Player");
    if (!objects.Any())
        return;

    var distances = objects.Select(s => Vector3.Distance(transform.position, s.transform.position)).ToArray();
    var first = distances.First();
    var index = 0;
    var index1 = 0;
    foreach (var distance in distances)
    {
        if (distance < first)
        {
            index1 = index;
            break;
        }
        index++;
    }

    var target = objects[index1];
    if (target == null)
        return;

    var p1 = transform.position;
    var p2 = target.transform.position;
    var position = new Vector3(p2.x, p1.y, p2.z); // does not bend to target
    transform.LookAt(position);
}

请注意,当最近的敌人发生变化时,过渡可能会突然发生,我将其留给您:)(提示:Vector3.SmoothDamp https://docs.unity3d.com/ScriptReference/Vector3.SmoothDamp.html)

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

尝试让一个对象查看 Unity 中的另一个对象 的相关文章

随机推荐

  • 未检测到 Flash 10:世界上最普遍的网络视频错误?

    问题如下 确保您对网站上 Flash 版本 x 的要求能够正确检测到更高版本的 Adob e Flash Player 版本 10 或 1y 的存在的最佳方法是什么 现在谜团来了 为什么这么多需要 Flash Player 版本 8 和 9
  • 01 背包专业化

    抱歉 如果这个问题已经得到解答 但我对算法没有深入的了解 并且并不总是注意到算法不同专业之间的微妙之处 我有 我认为是 01 背包问题的一个轻微变体 我有一个背包 其最大重量为 W 有 N 个重量为 w 价值为 v 的物品可供选择 我想要做
  • 为什么 Arc::try_unwrap() 会导致恐慌?

    我正在编写一个简单的聊天服务器 它向所有连接的客户端广播消息 由于我是初学者 代码可能看起来很糟糕 对等点尚未在任何地方使用 因为我想将其传递给handle client函数也是如此 因此当数据在流中可用并成功读取时 我想在所有连接的客户端
  • 为每个对象 JointJS 创建一个 ToolElement

    我试图为每个对象创建一种工具菜单 当您单击或将鼠标悬停在某个元素上时 它会显示可以执行的几个操作 删除 旋转 放大 链接等 我用过这个question https stackoverflow com questions 30153345 h
  • iOS CoreData批量插入?

    在我的 iPhone 应用程序中 我需要将大约 2000 条记录插入 Core Data 然后用户才能使用该应用程序的任何功能 我正在将记录从本地 JSON 文件加载到 CoreData 中 此过程需要很长时间 2 5 分钟以上 但只需要发
  • 当用户在 Chrome 上按下键盘时,如何检测“删除”和“.”?

    当我按下 它触发了三个事件 keydown keypress and keyup keydown which 190 keyCode 190 keypress which 46 keyCode 46 keyup which 190 keyC
  • AWS Lambda:在运行时获取当前重试尝试计数

    我有一个 AWS Lambda python3 7运行时 运行某个任务 及其MaximumRetryAttempts被设定为1 这意味着它可能会失败一次 然后再尝试一次 由于某种原因 我不会进入 我想知道 在运行时 这是第一次尝试还是第二次
  • Scala:没有明确已知类型参数的类型转换

    考虑以下示例 case class C T x T def f t T println t type ValueType T val list List 1 gt C 2 hello gt C goodbye for a b lt list
  • 后台任务SystemTriggerType.SmsReceived不会触发

    我正在后台 Windows Phone 8 1 中测试任务 但触发器SystemTriggerType SmsReceived不适合我 有人设法让它发挥作用吗 I used 这个例子 http code msdn microsoft com
  • "" 和 " " 之间有什么区别,如何根据字符测试前者?

    在Java中 空引号 和 带有单个空格的引号 之间有什么区别以及如何测试前者char 代表空字符串 is not空 它包含一个空格字符 你不能用以下方式来测试前者char 因为没有字符 用 a 来测试它String 它是String长度为零
  • 获取add_subdirectory添加的CMake项目版本

    我有一个依赖于 Google Test 库的 CMake 项目 我已经使用添加了 Google 测试ExternalProject Add and add subdirectory如此处所述 https github com google
  • jasig cas 重定向过多问题

    我正在尝试使用 spring security 和 spring security cas 带有 Jasig CAS 的 SSO 来保护 spring boot Web 应用程序 尝试访问受保护的资源时 我遇到了太多重定向错误 该项目可用h
  • 使用兆秒差距在不同位置出现多个错误

    我将使用 megaparsec 来解析大学项目的编程语言 但是 我寻找一种报告多个错误的方法 我知道 withRecovery 并且我看到了this https github com mrkkrp megaparsec issues 43问
  • PLSQL:使用合并语句时获取更新与插入的记录数

    无论我的记录如何使用 SQL ROWCOUNT 插入或更新 合并都会始终为您提供合并的记录数 但是如何找出实际插入的记录数与实际更新的记录数 我尝试了这篇文章中的选项 但这似乎不起作用 https asktom oracle com pls
  • Python - 在应用程序中直接显示网络浏览器/iframe

    我有一个脚本 如果对人们回答问题有帮助 那就使用 kivy 我想让它在运行时直接显示 iframe 之类的东西 而不是打开 浏览器 例如这样的事情 def browser url google com iframe url browser
  • 远程连接clearDB heroku数据库

    我如何使用 MySQL 查询浏览器等在 heroku 上远程连接到 ClearDB MySQL 数据库 从哪里获取 url 端口 登录名和密码 在 heroku 网站中 转到 我的应用程序 并选择已安装 ClearDB 的应用程序 在顶角单
  • 稀疏矩阵-矩阵乘法

    我目前正在使用稀疏矩阵 并且必须将稀疏矩阵 矩阵乘法与全矩阵 矩阵乘法的计算时间进行比较 问题是稀疏矩阵计算比全矩阵计算慢得多 我正在使用压缩行存储来压缩我的矩阵 并且将两个矩阵相乘非常耗时 四倍for循环 所以我想知道是否有更好的压缩格式
  • Highchart 日期选择器

    我正在尝试让 jquery ui datepicker 与 highcharts 一起使用 以便用户可以选择一个日期 例如 用户选择 10 月 10 日至 10 月 25 日 用户选择日期后 高图应重新绘制并显示已完成的项目的小时数以及任务
  • jQuery tablesorter 如何找到 sortList 对象

    我正在使用 jQuery 表排序器插件 我想存储用户如何对页面上的表格进行排序 并在下次加载页面时自动按这种方式排序 为此 我首先需要能够找到存储表排序方式的 sortList 对象 对于我的一生 我不知道如何获得它 该文档似乎没有任何相关
  • 尝试让一个对象查看 Unity 中的另一个对象

    嗨 我一直在尝试让对象 Tower 查看对象 Enemy 但是我收到错误 非静态字段 方法或属性 Enemy position 需要对象引用 这是敌人的类 我试图在其中定义敌人的位置以供塔参考 有谁知道如何解决这个问题 谢谢 public