fps第一视角触屏和相机转动

摘自我司主程周峰的 operationcontroller.cs   ,其中关于dpi的处理和触屏滑动控制相机值得参考学习。。


using System;
using System.Net.NetworkInformation;
using UnityEngine;
using System.Collections;


public class OperationController : MonoBehaviour
{
    protected static OperationController _inst = null;
    protected bool IsShooting = false;//是否一直发射


    protected AutoAim AimControl;


    public Transform RotateTrans
    {
        get
        {
            if (CachedRotateTrans == null)
            {
                CachedRotateTrans = Camera.main.transform;
                if (CachedRotateTrans.parent != null)
                {
                    CachedRotateTrans = CachedRotateTrans.parent;
                }
            }


            return CachedRotateTrans;
        }
    }


    protected Transform CachedRotateTrans;


    public static OperationController Instance
    {
        get
        {
            if (_inst == null)
            {
                _inst = FindObjectOfType<OperationController>();
                if (_inst == null)
                {
                    var obj = new GameObject("__OperationController");
                    _inst = obj.AddComponent<OperationController>();
                }
            }
            return _inst;
        }
    }


    private void OnEnable()
    {
        _inst = this;
    }


    private void OnDisable()
    {
        _inst = null;
    }


    void ProcessMouse()
    {
        bool isShoot = false;
        if (Input.GetMouseButton(0))
        {
            if (AimControl)
                AimControl.enabled = false;
            if (IsInShootRange(Input.mousePosition))
            {
                isShoot = true;
            }
        }
        else
        {
            if (AimControl)
                AimControl.enabled = true;
        }


        //Debug.LogWarning("pull the trigger" + isShoot);
        WeaponController.Instance.PullTrigger(isShoot || (SceneLoader.Instance.IsAutoAim && AimControl.Target));


        if (IsShooting != isShoot)
        {
            if (isShoot)
            {
                IsShooting = true;
                WeaponController.Instance.BeginShooting();
            }
            else
            {
                IsShooting = false;
                WeaponController.Instance.StopShooting();
            }
        }
    }


    void ProcessTouch()
    {
        bool isShoot = false;
        if (Input.touchCount > 0)
        {//多指触摸阶段
            if (AimControl)
                AimControl.enabled = false;


            int firstOutRange = -1;
            
            isShoot = false;
            for (int i = 0; i < Input.touchCount; i ++)
            {
                var touch = Input.GetTouch(i);
                if (IsInShootRange(touch.position))
                {
                    isShoot = true;
                }
                else
                {
                    if (firstOutRange == -1)
                    {
                        firstOutRange = i;
                    }
                }
            }


            if (firstOutRange == -1)
            {
                firstOutRange = 0;
            }
            Touch finger = Input.GetTouch(firstOutRange);


            if (finger.deltaPosition.SqrMagnitude() > 0 && finger.phase == TouchPhase.Moved)
            {
                Vector2 angularVelocity = Vector2.zero;


                float dt = Time.deltaTime / finger.deltaTime;
                if (float.IsNaN(dt) || float.IsInfinity(dt))
                    dt = 1.0f;
                
                var deltaPosition = finger.deltaPosition * dt;
                angularVelocity = Convert(deltaPosition, DistanceUnit.Pixels, DistanceUnit.Centimeters ) * 10f;


                angularVelocity.y = -angularVelocity.y;
                Vector2 angularMove = /*Time.deltaTime **/ angularVelocity;
                
                Vector3 localAngles = RotateTrans.localEulerAngles;
                // pitch angle
                localAngles.x = Mathf.Clamp(NormalizePitch(localAngles.x + angularMove.y), MaxUpAngle, MinDownAngle);
                // yaw angle
                localAngles.y = Mathf.Clamp(NormalizePitch(localAngles.y + angularMove.x), MinYawAngle, MaxYawAngle);


                localAngles.z = 0;


                RotateTrans.localEulerAngles = localAngles; //RestrictCameraAngles(cam.transform.eulerAngles);


            }
          //  if (isShoot)
            {
            }
           
        }
        else
        {
            if (AimControl)
                AimControl.enabled = true;
            
        }


        WeaponController.Instance.PullTrigger(isShoot || (SceneLoader.Instance.IsAutoAim && AimControl.Target));


        if (IsShooting != isShoot)
        {
            if (isShoot)
            {
                IsShooting = true;
                WeaponController.Instance.BeginShooting();
               // Debug.LogWarning("bofang dongh lo    ");
            }
            else
            {
                IsShooting = false;
                WeaponController.Instance.StopShooting();
            }
        }




    }
    /// <summary>
    /// 以下代码拷贝自“fingerguesture”,
    /// </summary>


    const float DESKTOP_SCREEN_STANDARD_DPI = 96; // default win7 dpi
    const float INCHES_TO_CENTIMETERS = 2.54f; // 1 inch = 2.54 cm
    const float CENTIMETERS_TO_INCHES = 1.0f / INCHES_TO_CENTIMETERS; // 1 cm = 0.3937... inches


    static float screenDPI = 0;


    public static float ScreenDPI
    {
        get
        {
            // not intialized?
            if (screenDPI <= 0)
            {
                screenDPI = Screen.dpi;


                // on desktop, dpi can be 0 - default to a standard dpi for screens
                if (screenDPI <= 0)
                    screenDPI = DESKTOP_SCREEN_STANDARD_DPI;


#if UNITY_IPHONE
                // try to detect some devices that aren't supported by Unity (yet)
                if( iPhone.generation == iPhoneGeneration.Unknown ||
                    iPhone.generation == iPhoneGeneration.iPadUnknown ||
                    iPhone.generation == iPhoneGeneration.iPhoneUnknown )
                {
                    // ipad mini 2 ?
                    if( Screen.width == 2048 && Screen.height == 1536 && screenDPI == 260 )
                        screenDPI = 326;
                }
#endif
            }


            return screenDPI;
        }


        set { screenDPI = value; }
    }
    public enum DistanceUnit
    {
        Pixels,
        Inches,
        Centimeters,
    }
    public static float Convert(float distance, DistanceUnit fromUnit, DistanceUnit toUnit)
    {
        float dpi = ScreenDPI;
        float pixelDistance;


        switch (fromUnit)
        {
            case DistanceUnit.Centimeters:
                pixelDistance = distance * CENTIMETERS_TO_INCHES * dpi; // cm -> in -> px
                break;


            case DistanceUnit.Inches:
                pixelDistance = distance * dpi; // in -> px
                break;


            case DistanceUnit.Pixels:
            default:
                pixelDistance = distance;
                break;
        }


        switch (toUnit)
        {
            case DistanceUnit.Inches:
                return pixelDistance / dpi; // px -> in


            case DistanceUnit.Centimeters:
                return (pixelDistance / dpi) * INCHES_TO_CENTIMETERS;  // px -> in -> cm


            case DistanceUnit.Pixels:
                return pixelDistance;
        }


        return pixelDistance;
    }
    //protected int currentTouchID = -1;
    
    public static float NormalizePitch(float angle)
    {
        angle %= 360;
        if (angle > 180.0f)
            angle -= 360.0f;


        return angle;
    }




    // convert a 2D motion vector from one distance unit to another one
    public static Vector2 Convert(Vector2 v, DistanceUnit fromUnit, DistanceUnit toUnit)
    {
        return new Vector2(Convert(v.x, fromUnit, toUnit),
                            Convert(v.y, fromUnit, toUnit));
    }


#if UNITY_EDITOR
    private static Vector2 LastMousePos;
    
#endif 


    void Update()
    {
        if (GameTimer.Instance.Pause)
        {
            UIBattleManager.Instance.AimPoint.gameObject.SetActive(false);
            return;
        }
        if (BossData.Instance && BossData.Instance.CantTouch)
        {
            UIBattleManager.Instance.AimPoint.gameObject.SetActive(false);
            return;
        }


        UIBattleManager.Instance.AimPoint.gameObject.SetActive(true);


#if UNITY_EDITOR
        if (Input.GetMouseButton(0))
        {
            Vector2 angularVelocity = Vector2.zero;
            if (LastMousePos == Vector2.zero)
            {
                LastMousePos = Input.mousePosition;
              //  return;
            }
            
            var deltaPosition = new Vector2(Input.mousePosition.x - LastMousePos.x,
                Input.mousePosition.y - LastMousePos.y);


            LastMousePos = Input.mousePosition;
            if (deltaPosition != Vector2.zero)
            {
                angularVelocity.x = deltaPosition.x / Screen.width * 40f;
                angularVelocity.y = -deltaPosition.y / Screen.height * 40f;


                Vector2 angularMove = angularVelocity;
                //var cam = Camera.main;


                Vector3 localAngles = RotateTrans.eulerAngles;
                // pitch angle
                localAngles.x = Mathf.Clamp(NormalizePitch(localAngles.x + angularMove.y), MaxUpAngle, MinDownAngle);


           //     Debug.LogWarning(localAngles.y +"     "+ angularMove.x + "     " + (localAngles.y + angularMove.x) + "   " + MinYawAngle + "   " + MaxYawAngle+ "    " + originEuler.y);
                // yaw angle
                localAngles.y = Mathf.Clamp(NormalizePitch(localAngles.y + angularMove.x), MinYawAngle, MaxYawAngle);


                localAngles.z = 0;


                //{
                //    var horizon = finger.deltaPosition.x/Screen.width*150f;
                //    var vertical = finger.deltaPosition.y/Screen.height*150f;
                //    cam.transform.Rotate(-vertical, horizon, 0);
                RotateTrans.eulerAngles = localAngles; //RestrictCameraAngles(cam.transform.eulerAngles);
                
            }


        }
        else
        {
            LastMousePos = Vector2.zero;
        }
        ProcessMouse();
#else
        ProcessTouch();
#endif


        
    }


    //public Vector3 RestrictCameraAngles(Vector3 euler)
    //{
    //    Debug.LogWarning(euler);
    //    if (euler.y > 180)
    //        euler.y = euler.y - 360;


    //    euler.y = Mathf.Clamp(euler.y, originEuler.y - MinYawAngle, originEuler.y + MaxYawAngle);
    //    if (euler.y < 0)
    //        euler.y += 360;




    //    if (euler.x > 180)
    //        euler.x = euler.x - 360;
    //    euler.x = Mathf.Clamp(euler.x, originEuler.x - MaxUpAngle, originEuler.x + MinDownAngle);
    //    if (euler.x < 0)
    //        euler.x += 360;


    //    euler.z = 0;
    //    return euler;
    //}


    public void OnInitScene()
    {
        originEuler = RotateTrans.localEulerAngles;
        if (originEuler.x > 180)
            originEuler.x = originEuler.x - 360;


        if (originEuler.y > 180)
            originEuler.y = originEuler.y - 360;


        Debug.LogWarning(MinDownAngle + " MinDownAngle " + MaxUpAngle + " MaxUpAngle " + MaxYawAngle + " MaxYawAngle " +
                         MinYawAngle + " MinYawAngle ");


        if (SceneLoader.Instance.IsAutoAim && AimControl == null)
            AimControl = gameObject.AddComponent<AutoAim>();
        RecalculateShootRange();
        EnemyController.Instance.SetSceneCfg(SceneLoader.Instance.CurrentCfgData);//DatabaseExporter.DataBaseManager.Instance.SceneCfgDataRecords[0]);
        DynamicSceneObjController.Instance.SetSceneCfg(SceneLoader.Instance.CurrentCfgData);//DatabaseExporter.DataBaseManager.Instance.SceneCfgDataRecords[0]);
        Player.Instance.ResetHp();
        //加载武器
        WeaponController.Instance.DoChangeWeapon();


        IsShooting = false;//是否一直发射
    }


    private Vector3 originEuler;
    private float MinDownAngle
    {
        get { return originEuler.x + StaticData.DownPitchAngle; }
    }


    private float MaxUpAngle
    {
        get { return originEuler.x - StaticData.UpPitchAngle; }
    }


    private float MaxYawAngle
    {
        get { return originEuler.y + StaticData.LeftYawAngle; }
    }


    private float MinYawAngle
    {
        get { return originEuler.y - StaticData.RightYawAngle; }
    }


    /// <summary>
    /// 葛文鹏添加,敌机彩弹等指示使用这个值
    /// </summary>
    /// <returns></returns>
    public Vector3 getOriginEuler()
    {
        return originEuler;
    }




    public bool IsOutOfSight(Quaternion rot)
    {


        
        var euler = rot.eulerAngles;
        euler.x = NormalizePitch(euler.x);
        euler.y = NormalizePitch(euler.y);


 //       Debug.LogWarning(euler + " " + MinDownAngle);
        if (MinDownAngle < euler.x) return true;
 //       Debug.LogWarning("check the x min down angle is correct" + MinDownAngle);
        if (MaxUpAngle > euler.x) return true;
//        Debug.LogWarning("check the x is correct" + MaxUpAngle);
        if (MaxYawAngle < euler.y) return true;
   //     Debug.LogWarning("check the y is correct" + MaxYawAngle);


        if (MinYawAngle > euler.y) return true;
     //   Debug.LogWarning("check the y is correct" + MinYawAngle);


        return false;


    }
    
    ///触控区域,用于控制射击
    private  Vector2 ShootXRange;
    private  Vector2 ShootYRange;
    private  Vector2 ScreenCenter;




    void RecalculateShootRange()
    {
        ShootXRange = new Vector2(Mathf.Floor(Screen.width * (1 - StaticData.HorizontalSize)), Screen.width);
        ShootYRange = new Vector2(0, Screen.height * StaticData.VerticalSize);


        ///屏幕中心点等于1/2屏幕大小
        ScreenCenter = new Vector2(Screen.width*0.5f, Screen.height *0.5f);
    }


    public bool IsInShootRange(Vector2 touchPos)
    {


        if (touchPos.x < ShootXRange.x || touchPos.x > ShootXRange.y)
            return false;
        if (touchPos.y < ShootYRange.x || touchPos.y > ShootYRange.y)
            return false;
        return true;
        //  return true;
    }


    public Vector2 SightPos
    {
        get { return ScreenCenter; }
    }




    public void OnRemoveEnemy(EnemyBase enemy)
    {
        if (AimControl) AimControl.OnRemoveEnemy(enemy);
    }




}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值