精灵箭矢与精灵弩矢(追踪箭矢与弩矢)(U6)

精灵箭矢与精灵弩矢(追踪箭矢与弩矢)(U6)

观看视频了解箭矢的实际效果 你是否厌倦了用弓箭或弩箭总是射不中目标?别再烦恼了!你这个小作弊者。如果你没有弩箭,请不要下载V2版本。

武器

public class ElvenArrow : MonoBehaviour { protected Item item; public Creature target; public Transform headTransform; public ItemModuleElvenArrow module;

protected void Awake()
{
    item = this.GetComponent<Item>();
    module = item.data.GetModule<ItemModuleElvenArrow>();
    item.OnGrabEvent += ElvenGrab;
    item.OnTeleGrabEvent += ElvenTeleGrab;
    item.OnUngrabEvent += ElvenUngrab;
    item.OnCollisionEvent += ElvenCollision;
    headTransform = item.definition.GetCustomReference("HeadTransform");
}

void ElvenCollision(ref CollisionStruct collisionInstance)
{
    if (collisionInstance.targetType != CollisionStruct.TargetType.NPC)
    {
        item.rb.AddForce(item.transform.forward.normalized * 10f, ForceMode.Impulse);
    }
    if (collisionInstance.otherInteractiveObject)
    {
        if(collisionInstance.otherInteractiveObject.handlers.Count > 0)
        {
            collisionInstance.otherInteractiveObject.disableCollisionDetection = true;
            item.rb.AddForce(item.transform.forward.normalized * 10f, ForceMode.Impulse);
        }
    }
}

void ElvenUngrab(Handle handle, Interactor interactor, bool throwing)
{
    item.rb.mass = 0.1f;
}

void ElvenGrab(Handle handle, Interactor interactor)
{
    target = null;
    item.rb.mass = 0.01f;
}

void ElvenTeleGrab(Handle handle, Telekinesis telekinesis)
{
    target = null;
}

void Update()
{
    if(!target && item.isFlying && item.rb.velocity.magnitude >= 3f)
    {
        SetTarget();
    }
    if (target)
    {
        if (item.rb.velocity.magnitude < 3f)
        {
            target = null;
        }
        else
        {
            float initVelocity = item.rb.velocity.magnitude;
            item.transform.LookAt(target.body.headBone);
            item.rb.velocity = Vector3.zero;
            item.rb.AddForce(item.transform.forward.normalized * initVelocity, ForceMode.VelocityChange);
        }
    }
}

void SetTarget()
{
    float minAngle = module.maxAngle;
    target = null;
    if(Creature.list.Count > 0)
    {
        foreach(Creature npc in Creature.list)
        {
            if (npc != Creature.player && npc.state != Creature.State.Dead)
            {
                if (npc.body)
                {
                    if (npc.body.headBone)
                    {
                        if (Vector3.Angle(headTransform.position - item.transform.position, npc.body.headBone.position - item.transform.position) < minAngle)
                        {
                            target = npc;
                            minAngle = Vector3.Angle(headTransform.position - item.transform.position, target.body.headBone.position - item.transform.position);
                        }
                    }
                }
            }
        }
    }
}

}