试图让一个对象在Unity中查看另一个对象 [英] Trying to make an object look at another object in Unity

查看:146
本文介绍了试图让一个对象在Unity中查看另一个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hia我一直试图使对象"Tower"看起来像对象"Enemy",但是却出现错误非静态字段,方法或属性'Enemy需要对象引用" .position'"

Hia I've been trying to make an object "Tower" look at the object "Enemy" however I've been getting the error "An object reference is required for the non-static field, method, or property 'Enemy.position' "

这是敌人的课程,在这里我尝试定义敌人的位置以供塔参考.

This is the class for the Enemy where I've tried to define the position of the enemy for the Tower to reference to.

有人知道如何解决此问题吗?谢谢

Does anyone know how this can be fixed? Thanks

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;"导致错误.

Here is the class for the Tower where "var lookPos = Enemy.position - transform.position;" is causing the error.

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' 要求对象引用strong>

An object reference is required for the non-static field, method, or property 'Enemy.position'

这是因为Enemy中的position不是static.

相反,您可以执行以下操作:

Instead you could do something like this:

class Tower
{
    public Enemy Victim;

    /// ...
}

您可以在检查器中分配Victim,然后使用它代替您的Enemy.position,但是,由于需要手动分配,因此此方法受到限制.

You would assign Victim in the Inspector then you would use that instead of your Enemy.position, however, this approach becomes limited because of the need to assign it manually.

替代解决方案:

塔中的一个独特脚本

  • 搜索标记为 Player
  • 的对象
  • 查看找到的第一个
  • searches for objects tagged Player
  • looks at the first one found, if any

代码:

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 )

Note that transition can be abrupt when the closest enemy changes, I'm leaving that to you :) (hint: Vector3.SmoothDamp)

这篇关于试图让一个对象在Unity中查看另一个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆