コード例 #1
0
    void TurretRoutine()
    {
        if (animateTurret != _TurretAni.None && !unit.IsStunned())
        {
            Vector3 shootPos = turretObject.position;

            if (animateTurret == _TurretAni.YAxis)
            {
                Vector3 targetPos = target.GetTargetT().position;
                targetPos.y = turretObject.position.y;

                Quaternion wantedRot = Quaternion.LookRotation(targetPos - turretObject.position);
                turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime);

                if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance)
                {
                    targetInLOS = true;
                }
                else
                {
                    targetInLOS = false;
                }
            }
            else if (animateTurret == _TurretAni.Full)
            {
                if (turretRotationModel == _RotationMode.FullTurret)
                {
                    Vector3    targetPos = target.GetTargetT().position;
                    Quaternion wantedRot = Quaternion.LookRotation(targetPos - turretObject.position);

                    //calculate elavation offset
                    float distFactor = Mathf.Min(1, Vector3.Distance(turretObject.position, targetPos) / turretMaxRange);
                    float offset     = distFactor * turretMaxAngle;
                    wantedRot *= Quaternion.Euler(-offset, 0, 0);

                    turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime);

                    if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance)
                    {
                        targetInLOS = true;
                    }
                    else
                    {
                        targetInLOS = false;
                    }
                }
                else if (turretRotationModel == _RotationMode.SeparatedBarrel)
                {
                    Vector3 targetPos = target.GetTargetT().position;
                    Vector3 dummyPos  = targetPos;
                    dummyPos.y = turretObject.position.y;

                    Quaternion wantedRot = Quaternion.LookRotation(dummyPos - turretObject.position);
                    turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime);

                    //calculate elavation offset
                    if (barrelObject != null)
                    {
                        shootPos = barrelObject.position;

                        wantedRot = Quaternion.LookRotation(targetPos - barrelObject.position);
                        wantedRot = Quaternion.Euler(wantedRot.eulerAngles.x, barrelObject.rotation.eulerAngles.y, 0);

                        float distFactor = Mathf.Min(1, Vector3.Distance(turretObject.position, targetPos) / turretMaxRange);
                        float offset     = distFactor * turretMaxAngle;
                        wantedRot *= Quaternion.Euler(-offset, 0, 0);

                        barrelObject.rotation = Quaternion.Slerp(barrelObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime);

                        if (Quaternion.Angle(barrelObject.rotation, wantedRot) < aimTolerance)
                        {
                            targetInLOS = true;
                        }
                        else
                        {
                            targetInLOS = false;
                        }
                    }
                    else
                    {
                        if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance)
                        {
                            targetInLOS = true;
                        }
                        else
                        {
                            targetInLOS = false;
                        }
                    }
                }
            }

            if (targetInLOS && losMode == _LOSMode.Realistic)
            {
                Vector3    targetPos = target.GetTargetT().position;
                Vector3    dir       = targetPos - shootPos;
                float      dist      = Vector3.Distance(targetPos, shootPos);
                RaycastHit hit;
                if (Physics.Raycast(shootPos, dir, out hit, dist))
                {
                    if (hit.transform != target.thisT)
                    {
                        targetInLOS = false;
                        //Debug.DrawLine(targetPos, shootPos, Color.white, .75f);
                        //Debug.DrawLine(hit.point, shootPos, Color.red, .75f);
                    }
                }
            }
        }
    }