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

Hia我一直试图让一个对象“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; } 

}

这是塔的类,其中“var lookPos = 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’需要对象引用

这是因为Enemy position不是static

相反,你可以做这样的事情:

 class Tower { public Enemy Victim; /// ... } 

您可以在Inspector中分配Victim ,然后使用它而不是您的Enemy.position ,但是,由于需要手动分配,这种方法会受到限制。

替代方案:

塔中有一个独特的剧本

  • 搜索标记为Player的对象
  • 看看发现的第一个,如果有的话

码:

 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 )