试图使一个对象看到Unity中的另一个对象

时间:2017-01-20 16:42:34

标签: c# unity3d

Hia我一直试图让一个物体“塔”看到对象“敌人”但是我一直在收到错误“非静态场,方法或属性需要对象引用”Enemy .position'“

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

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

<table>
  <thead>
    <th>header 1</th>
    <th>header 2</th>
  </thead>
  <tbody>
    <td>row value 1</td>
    <td>row value 2</td>
  </tbody>
</table>
<table class='inventory_related'>
  <thead>
    <th>header</th>
    <th>header 2</th>
  </thead>
  <tbody>
    <td>row value 3</td>
    <td>row value 4</td>
  </tbody>
</table>

}

这是Tower的类,其中“var lookPos = Enemy.position - transform.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;
}

1 个答案:

答案 0 :(得分:2)

非静态字段,方法或属性需要对象引用&#39; Enemy.position&#39;

这是因为position中的Enemy不是static

相反,你可以这样做:

class Tower
{
    public Enemy Victim;

    /// ...
}

您可以在检查器中指定Victim,然后使用它而不是Enemy.position,但是,由于需要手动分配,此方法会受到限制。

替代解决方案:

塔中的一个独特脚本

  • 搜索标记为播放器
  • 的对象
  • 查看找到的第一个,如果有的话

代码:

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