📜  unityEngine.Transform.get_position() (在<a0ef933b1aa54b668801ea864e4204fe>:0) Gamekit3D.MeleeWeapon.BeginAttack (System.Boolean thowingAttack) - C# (1)

📅  最后修改于: 2023-12-03 14:48:13.139000             🧑  作者: Mango

介绍:使用 unityEngine.Transform.get_position() 方法的程序示例

本文介绍了一个示例程序,在其中使用了 unityEngine.Transform.get_position() 方法。这个方法是用来获取 GameObject 的位置信息的。示例程序是一个简单的近战武器,当开启攻击时,它会使用该方法获取自己的位置信息。

代码示例

下面是使用了 unityEngine.Transform.get_position() 方法的示例代码:

using UnityEngine;

public class MeleeWeapon : MonoBehaviour
{
    public float attackRange;
    public int attackAmount;
    public float attackDelay;
    public LayerMask attackLayer;    
    public GameObject attackEffect;

    private Collider[] hits;
    private Transform weaponTransform;

    private void Start()
    {
        weaponTransform = transform;
        hits = new Collider[10];
    }

    public void BeginAttack(bool throwingAttack)
    {
        Vector3 attackPosition = weaponTransform.get_position(); // 使用 get_position() 方法获取自身位置

        if (throwingAttack)
        {
            attackPosition += weaponTransform.forward * 2f;
        }

        StartCoroutine(PerformAttack(attackPosition));
    }

    private IEnumerator PerformAttack(Vector3 position)
    {
        yield return new WaitForSeconds(attackDelay);

        int hitCount = Physics.OverlapSphereNonAlloc(position, attackRange, hits, attackLayer);

        for (int i = 0; i < hitCount; i++)
        {
            Debug.Log("Attacking " + hits[i].name);
            // 给每个受击的物体造成不同的伤害量
            hits[i].GetComponent<Health>().TakeDamage(attackAmount * i);

            if (attackEffect != null)
            {
                Instantiate(attackEffect, hits[i].transform.position, Quaternion.identity);
            }
        }
    }
}

这里使用了 Vector3 类型的变量来保存武器所在位置,该变量通过 weaponTransform.get_position() 方法获取。然后使用该变量来执行武器的攻击。

代码解释

weaponTransform 变量是使用 Transform 类型的 transform 属性来初始化的。这个属性是 GameObject 类型中的一个成员,表示该物体在场景中的转换信息。

public void BeginAttack(bool throwingAttack) 是一个函数,该函数在开始进行攻击时被调用。public 表示该函数是公开的,可以从其他类中调用。bool throwingAttack 是一个布尔类型的输入参数,它表示武器在攻击时是否会进行投掷攻击。

在该函数中,使用了 weaponTransform.get_position() 方法来获取近战武器自身的位置信息。如果 throwingAttack 为真,则将位置向前方移动 2 个单位长度。然后调用了 PerformAttack 函数,来完成攻击操作。

PerformAttack 主要完成追踪攻击,即通过射线检测来判断攻击是否命中。输入参数 position 表示武器的位置信息。该函数会在攻击的攻击延迟期结束后调用。

Physics.OverlapSphereNonAlloc(position, attackRange, hits, attackLayer) 用于判断在给定位置、给定半径内是否有物件被检测到。如果有,将会返回被检测到的对象个数,并将这些对象的 Collider 组件放入数组 hits 中。

接下来的 for 循环,通过遍历所有击中的 Collider 组件,并对其进行一系列伤害操作。这里也可以在伤害计算时增加一个随机攻击力的变化。最后,通过实例化 attackEffect 特效来增加打击感。

总结

unityEngine.Transform.get_position() 方法是用来获取物体位置信息的。在使用该方法时,需要先创建一个 Transform 对象。本文提供了一个示例程序,该程序使用了该方法,并演示了如何使用该方法来完成武器的近战攻击。