摘自我司主程周峰的 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);
}
}