试图使一个对象看到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
,但是,由于需要手动分配,这种方法会受到限制。
替代方案:
塔中有一个独特的剧本
码:
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 )
上述就是C#学习教程:试图使一个对象看到Unity中的另一个对象分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998094.html