从选定对象获取数据
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);
}
我正在寻找一种方法来从我在游戏中拥有“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);
}