非静态字段、方法或属性“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)