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;
}
答案 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)