停滞匕首 (U7)

停滞匕首 (U7)

[U7兼容] 挥舞这把受诅咒匕首的力量!使用动作键将武器固定在空中,穿刺你的敌人,利用它们攀爬,甚至重现那著名的约翰·威克场景。你可以通过抓取匕首来使用

武器

模型感谢Teliri:https://sketchfab.com/3d-models/dagger-low-poly-01db689d606a4cbb879b1fba67b55fa8

使用这把武器,你可以停止所有物理计算,以下是我使用的代码:

namespace StasisDagger
{
    public class ItemStasisWeapon : MonoBehaviour
    {
        // 我声明我的变量。我会在使用它们时解释它们。
        protected Interactor rightInteractor;
        protected Interactor leftInteractor;
        protected Item item;
        public bool wasTeleGrabbed = false;
        public float timer = 0.0f;

        protected void Awake()
        {
            // 我存储物品本身以便能够引用它
            item = this.GetComponent<Item>();
            // 我在持有武器、念力、释放念力和抓取武器的方法中注入了自定义代码。
            item.OnHeldActionEvent += OnHeldAction;
            item.OnTeleUnGrabEvent += OnTeleUnGrabAction;
            item.OnTeleGrabEvent += OnTeleGrabAction;
            item.OnGrabEvent += OnGrabAfterTele;
        }

        // 你想用心灵传动来移动匕首,所以你将 isKinematic 设为 false
        public void OnTeleGrabAction(Handle handle, Telekinesis teleGrabber)
        {
            if (handle.rb.isKinematic == true)
            {
                handle.rb.isKinematic = false;
            }
        }

        // 如果你松开念力,你希望武器在未被抓住时保持原位,而在被远程抓住时表现正常。为此,你将其设置为运动学,我们稍后会处理远程抓住时的情况。
        public void OnTeleUnGrabAction(Handle handle, Telekinesis teleGrabber)
        {
            wasTeleGrabbed = true;
            handle.rb.isKinematic = true;
        }

        // 如果你用远程抓取匕首,你不希望它保持静止,所以一旦你抓住它,就立即将 isKinematic 设置为 false,仅当它来自远程抓取时,因为你希望能够使用匕首攀爬,而这只有在正常抓取时它们保持运动学状态才能实现。
        public void OnGrabAfterTele(Handle handle, Interactor interactor)
        {
            if (wasTeleGrabbed)
            {
                handle.rb.isKinematic = false;
            }
        }

        // Interactable.Action 存储你在控制器中按下的按钮。AlternateUseStart 是按下动作按钮,至少在 Oculus 中,我使用的是:
        public void OnHeldAction(Interactor interactor, Handle handle, Interactable.Action action)
        {
            if (action == Interactable.Action.AlternateUseStart)
            {
                item.rb.isKinematic = !item.rb.isKinematic;
            }
        }

        // 这会使飞镖在短暂延迟后不再被视为隔空取物,因此你可以在不使其失去运动状态的情况下抓住它们
        void FixedUpdate()
        {
            if (wasTeleGrabbed)
            {
                timer += Time.deltaTime;
                if (timer > 0.1f)
                {
                    wasTeleGrabbed = false;
                    timer = 0f;
                }
            }
        }
    }
}

请随意将其添加到您自己的武器中,只需将 .dll 文件复制到您修改的武器文件夹中,并在 Item_Weapon.json 文件中引用它。您需要在 "modules": 之后添加此代码。

{
"$type": "StasisDagger.ItemModuleStasisWeapon, StasisDagger"
},