从选定对象获取数据

Obtaining data from selected object

我正在寻找一种方法来从我在游戏中拥有“selected/targeted”的对象获取数据。示例:我想 select 一个敌人进行攻击,然后从附加到他们的脚本中获取 hp 值并将其与玩家脚本上的攻击值进行比较。我在 google 和 youtube 上四处张望,但没有找到任何运气。希望有人能帮助我或指点我看一下指南。

代码形式的示例: 脚本 1:

public class Enemy : MonoBehaviour
{
public int enemyHealth;
}

脚本 2:

public class Player : MonoBehaviour
{
    public Enemy enemy;
    public int playerAtk;
}

public void Attack()
{
    "Selected enemy's enemy script".health -= playerAtk;
}

你必须通过特定的事件来访问敌人。例如,击中子弹或在其上单击鼠标时。下面是一些如何获取敌人的示例,但请记住,获取敌人的方法有无数种。


触发输入

这是一种非常简单的方法,此代码在播放器中有效 class。 collider键可以让你访问敌人,现在你可以通过按住它的组件来访问方法。

public void OnTriggerEnter(Collider other)
{
    var _enemy = other.GetComponent<Enemy>(); // // Get Enemy class

    _enemy?.Damage(10); // damage method run.

    _enemy?.Damage(this, 10f); // Send player to method and cause damage
}

物理光线投射

这将通过从相机投射光线来实现,光线投射代码所做的是 return raycastHit 格式的撞击点。获取后,您可以访问您的其他raycastHit组件,如下所示。

public void Update()
{
    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if (!Input.GetKeyDown(KeyCode.Mouse0)) return;

    if (Physics.Raycast(ray, out var RaycastHit))
    {
        var _enemy = RaycastHit.transform.GetComponent<Enemy>();

        _enemy?.Damage(10);
    }
}

在检查器中指定

这个方法可以把所有的敌人放在一个数组中,通过调用索引来伤害它们。

public Enemy[] myEnemy;

public void Damage(int index)
{
    myEnemy[index].Damage(10);
}

按类型查找

另一种流行的方法是捕获所有敌人并根据特定条件过滤它们。这个方法也是这样执行的

var enemies = FindObjectsOfType<Enemy>();

foreach (var _enemy in enemies.Where(e => e.health >= 40f))
{
    _enemy.Damage(100);
}