Exemple #1
0
    /// <summary>
    /// Call this to hit enemy and play hit reactions based on collision point.
    /// impact determines damage.
    /// </summary>
    public void Hit(Collider hitCollider, Vector3 collisionPoint, float impact)
    {
        if (!isHit)
        {
            isHit = true;

            int damage = 5 * (int)impact + Random.Range(-10, 10);

            // Run hit animation
            Vector3 dir = hitCollider.transform.position - collisionPoint;
            hitReaction.Hit(hitCollider, dir.normalized * impact / 5, collisionPoint);

            // Show hit number pop up
            if (hitPoints > 0)
            {
                ShowHitNumber(damage);

                // Calculate damage
                OnHit(damage);

                // Play Effect
                HitEffect(collisionPoint);

                RandomHitSound();

                print("damage " + damage + " impact " + impact);
            }
        }
    }
    private void OnCollisionEnter(Collision other)
    {
        Debug.Log("collision");
        var hitCollider = other.contacts[0].thisCollider;
        var point       = other.GetContact(0).point;

        hitReaction.Hit(hitCollider, other.rigidbody.velocity * hitForce, point);
    }
 public void reactOnHit(Collider collider, Vector3 force, Vector3 point)
 {
     m_hitReaction.Hit(collider, force, point);
 }
    public void Hit(Collider collider, Vector3 direction, Vector3 point, int damage)
    {
        //Debug.LogWarning(direction.magnitude);
        //if (isDead)
        //    return;

        if (actionState != MonsterStateEnum.Normal)
        {
            return;
        }

        //if (isHitReact)
        //    return;

        currentHP -= damage;
        if (currentHP < 0)
        {
            isDead = true;
        }

        //isHitReact = true;
        SetState(MonsterStateEnum.HitReact);

        float hitForce = direction.magnitude;

        if (hitForce < LightHitForceGrade)
        {
            // Use the HitReaction
            hitReaction.Hit(collider, direction, point);
            if (isDead)
            {
                animator.SetBool("IsDead", true);
                SetState(MonsterStateEnum.Dead);
            }
            else
            {
                animator.SetBool("IsHit", true);
                hitReactType = 0;
            }
            //direction.y = 0;
            //transform.Translate(direction);
            ////rigidbody.velocity = (direction.normalized + (Vector3.up * 1)) * 1 * 1;
            //rigidbody.velocity = direction;
        }
        else if (hitForce < MediumHitForceGrade)
        {
            // Use the HitReaction
            hitReaction.Hit(collider, direction, point);

            //Vector3 forward = transform.TransformDirection(Vector3.forward);
            if (Vector3.Dot(transform.forward, direction) < 0)
            {
                animator.SetBool("IsKnockDownFront", true);
            }
            else
            {
                animator.SetBool("IsKnockDownBack", true);
            }
            hitReactType = 1;
        }
        else if (hitForce < HardHitForceGrade)
        {
            //animator.SetBool("IsKnockDown", true);

            ragdollUtility.EnableRagdoll();
            hitReactType = 2;

            Rigidbody rigi = collider.gameObject.GetComponent <Rigidbody>();
            if (rigi != null)
            {
                rigidbody.velocity = direction;
            }
            currentHP = 0;
            isDead    = true;

            SetState(MonsterStateEnum.Dead);
        }
        else
        {
            //Knock Away
        }
    }