霍妮特的苦无(回旋苦无)(U7LWRP)

霍妮特的苦无(回旋苦无)(U7LWRP)

看看视频里的内容!来自《空洞骑士》的黄蜂针。投掷它,一根丝线会附着在你的手上,无论你扔多远,针都会回到你手中。它还会自动从敌人身上脱离。

武器

[代码未更新至U7LWRP]

这是代码:

public class ItemWaspStinger : OperableBehaviour
{
    protected Item item;
    private Transform needleTransform;
    private Transform silkSpawnTransform;
    private Transform handTransform;
    private Transform meshTransform;
    private GameObject silk;
    private GameObject silkClone;
    private Interactor throwingHand;
    private Vector3 returnDirection;
    private bool isReturning = false;
    private bool wasThrown = false;
    private bool justThrown = true;
    public float returnSpeed = 15f;
    public float returningBubble = 0.5f;
    public float maxSpeed = 15f;
    public float stuckMultiplier = 1f;
    public float stuckMultiplierValue = 20f;
    public float silkSize = 1f;
    public float initialSize;

    protected void Awake()
    {
        item = this.GetComponent<Item>();
        needleTransform = item.transform;
        silkSpawnTransform = item.definition.GetCustomReference("SilkSpawnTransform");
        silk = needleTransform.Find("Silk").gameObject;
        Debug.Log(silk.name);
        meshTransform = needleTransform.Find("Mesh");
        item.OnCollisionEvent += OnNeedleCollisionEvent;
        item.OnGrabEvent += OnNeedleGrabEvent;
        item.OnTeleGrabEvent += OnNeedleTeleGrab;
        item.OnUngrabEvent += OnNeedleUngrabEvent;
    }

    void OnNeedleCollisionEvent(ref CollisionStruct collisionInstance)
    {
    }

    void OnNeedleTeleGrab(Handle handle, Telekinesis teleGrabber)
    {
        isReturning = false;
    }

    void OnNeedleGrabEvent(Handle handle, Interactor interactor)
    {
        Reset();
    }

    void OnNeedleUngrabEvent(Handle handle, Interactor interactor, bool throwing)
    {
        handTransform = interactor.transform;
        throwingHand = interactor;
        item.rb.useGravity = false;
        item.rb.freezeRotation = true;
    }

    void FixedUpdate()
    {
        if (item.isFlying && justThrown)
        {
            wasThrown = true;
            justThrown = false;
            silkClone = Instantiate(silk, silkSpawnTransform.position, silkSpawnTransform.rotation, meshTransform);
            initialSize = silkClone.transform.localScale.y;
            Debug.Log("初始大小:" + initialSize);
        }
        else if (!item.isFlying && justThrown && wasThrown)
        {
            item.rb.useGravity = true;
        }

        if (wasThrown)
        {
            silkSize = Vector3.Distance(needleTransform.position, handTransform.position) * 100f;
            silkClone.transform.localScale = new Vector3(silkClone.transform.localScale.x, silkClone.transform.localScale.y, silkSize * initialSize);
            Debug.Log("重新计算的大小: " + silkSize * initialSize);
        }

        if (item.isPenetrating && isReturning)
        {
            Invoke("Destuck", 0.5f);
        }
        else
        {
            stuckMultiplier = 1f;
        }

        if (isReturning)
        {
            Return();
        }

        if (wasThrown)
        {
            SetRotation();
        }

        if (item.rb.velocity.magnitude <= 3f &amp;&amp; !isReturning &amp;&amp; wasThrown)
        {
            isReturning = true;
            item.isFlying = false;
        }
    }

    void StartReturning()
    {
        isReturning = true;
    }

    void Return()
    {
        returnDirection = handTransform.position - needleTransform.position;
        returnDirection.Normalize();
        needleTransform.LookAt(handTransform);

        if (item.rb.velocity.magnitude &lt; maxSpeed)
        {
            item.rb.AddForce(returnDirection * returnSpeed * stuckMultiplier, ForceMode.Force);
        }

        needleTransform.LookAt(handTransform);

        if (Vector3.Distance(needleTransform.position, handTransform.position) <= returningBubble)
        {
            if (throwingHand.grabbedHandle == null)
            {
                throwingHand.Grab(item.handles[0]);
            }
            else
            {
                Reset();
            }
        }
    }

    void SetRotation()
    {
        needleTransform.LookAt(handTransform);
    }

    void Reset()
    {
        item.rb.useGravity = true;
        isReturning = false;
        wasThrown = false;
        item.rb.freezeRotation = false;
        justThrown = true;
        Destroy(silkClone);
    }

    void Destuck()
    {
        stuckMultiplier = stuckMultiplierValue;
    }
}