回旋镖 (U7)

回旋镖 (U7)

U7 兼容!独自前行太危险,带上这个!来自《时之笛》中林克的回旋镖。投掷出去,它会回到你手中。

武器

一如既往,这是代码:

namespace Boomerang { // 物品模块会为物品对象添加一个Unity组件。更多信息请参阅Unity MonoBehaviour:https://docs.unity3d.com/ScriptReference/MonoBehaviour.html // 当触发器被按下时,该组件会对玩家刚体施加一个朝向物品变换方向的力(参见物品预制体中物品定义组件的自定义引用) public class ItemBoomerang : MonoBehaviour { protected Item item; private Transform boomerangTransform; private Transform headTransform;

    public ItemModuleBoomerang 模块;
    private Vector3 返回方向;

    private bool isSpinning = false;  
    private bool isReturning = false;  
    private bool firstTrow = true;  
    private bool reachedBubble = false;

    private float bubbleTimer = 0f;  
    private float bubbleTimeOut = 1f;

    protected void Awake() {
        item = this.GetComponent<Item>();
        headTransform = Player.local.head.gameObject.transform;
        boomerangTransform = item.transform;

        模块 = 物品.数据.获取模块<物品模块回旋镖>();

        item.OnCollisionEvent += OnBoomerangCollisionEvent;
        item.OnGrabEvent += OnBoomerangGrabEvent;
        item.OnTeleGrabEvent += OnBoomerangTeleGrab;
        item.OnUngrabEvent += OnBoomerangUngrabEvent;
    }

    void OnBoomerangCollisionEvent(ref CollisionStruct collisionInstance) {
        停止旋转();
    }

    void OnBoomerangTeleGrab(Handle handle, Telekinesis teleGrabber) {
        停止旋转();
    }

    void OnBoomerangGrabEvent(Handle handle, Interactor interactor) {
        停止旋转();
    }

    void OnBoomerangUngrabEvent(Handle handle, Interactor interactor, bool throwing) {
        开始旋转();
    }

    void FixedUpdate() {
        如果 (正在旋转) {
            回旋镖变换.旋转(向量3.前方, 模块.旋转速度);
            如果(物品.刚体.速度.大小 <= 3f && !正在返回) {
                开始返回();
            }
        }

        if (isReturning) {
            if (Vector3.Distance(boomerangTransform.position, headTransform.position) <= module.returningBubble) {
                达到气泡 = 真;
            }

            如果(物品.刚体.速度.大小 < 模块.最大速度) {
                物品.刚体.添加力(返回方向 * 模块.返回速度, 力模式.加速度);
            }

            如果 (到达气泡) {
                气泡计时器 += 时间.增量时间;
            }

            如果(气泡计时器 >= 气泡超时时间) {
                停止旋转();
            }
        }
    }

    void StopSpinning() {
        isSpinning = false;
        item.rb.useGravity = true;
        isReturning = false;
        firstTrow = true;
        bubbleTimer = 0f;
        reachedBubble = false;
    }

    void StartSpinning() {
        if(item.rb.velocity.magnitude > module.minSpeedForSpinning) {
            isSpinning = true;
            item.rb.useGravity = false;
        }
    }

    void StartReturning() {
        if (firstTrow) {
            firstTrow = false;
            isReturning = true;
            returnDirection = headTransform.position - boomerangTransform.position;
            returnDirection.Normalize();
        }
    }
}

}