pc,android,iphone三个平台上摄像机复杂操作

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TestFocus : MonoBehaviour
{
public Text tex;
public Transform kTarget;
public float initDistance = 13.7f;
public float distanceMax = 30f;
public float desiredDistance;
public float scrollSpeed = 12f;
public float rotateSpeed = 8f;
public float panSpeed = 0.3f;

private float DPI = 0;
private float currentDistance = 0f;
private float mouseX = 0f;
private float mouseY = 0f;
private Vector3 _tInitPos;
private Vector3 velocity = Vector3.zero;
private float velocityZ = 0f;
private float delayZ = 0.3f;
private Quaternion currentRotation;
private Quaternion desiredRotation;

private float lastDistance; //实现距离拉近拉远的平滑效果,上一次相机停留点
private float perDistance; //实现距离拉近拉远的平滑效果,每一帧相机要移动到的位置

private Vector2 endone; //用来记录缩放趋势
private Vector2 endtwo;

private bool isTouch = false; //是否是触屏
private bool isPc = false;
private bool centerFinish = true;

RaycastHit hit;
bool _isFocus = false;
Transform mTrans;

void Awake()
{
mTrans = this.transform;

#if UNITY_ANDROID
isTouch = true;
Debug.Log("这里是安卓设备^_^");
#endif

#if UNITY_IPHONE
isTouch = true;
Debug.Log("这里是苹果设备>_<");
#endif

#if UNITY_STANDALONE_WIN
isPc = true;
Debug.Log("我是从Windows的电脑上运行的T_T");
#endif
}

// Use this for initialization
void Start ()
{
DPI = 1080f / Screen.width;
_tInitPos = kTarget.position;
initDistance = Mathf.Clamp(initDistance, 1.25f, distanceMax);
currentDistance = desiredDistance = initDistance;

}

// Update is called once per frame
void LateUpdate()
{
if (_isFocus)
{
kTarget.position = Vector3.SmoothDamp(kTarget.position, hit.transform.position, ref velocity, delayZ - 0.1f);
desiredDistance = initDistance;
}
}

void Update()
{

//键盘控制中的居中显示
if (Input.GetMouseButtonUp(0) && isPc)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
if (hit.collider != null)
_isFocus = true;
tex.text = "键盘控制居中";
}
}

//触屏中的居中显示
if (Input.touchCount == 1 && isTouch && Input.GetTouch(0).phase == TouchPhase.Stationary)
{
Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
if (Physics.Raycast(ray, out hit))
{
if (hit.collider != null)
_isFocus = true;
tex.text = "触屏控制居中";
}
}
//触屏控制
if (isTouch)
{
if (Input.touchCount > 0)
{
tex.text = "触屏";
if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
_isFocus = false;
mouseX += Input.GetTouch(0).deltaPosition.x * rotateSpeed * DPI * 0.3f;
mouseY -= Input.GetTouch(0).deltaPosition.y * rotateSpeed * DPI * 0.3f;
tex.text = "触屏旋转中";
}

//触屏缩放
if (Input.touchCount == 2)
{
_isFocus = false;

if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)
{
Vector2 startone = Input.GetTouch(0).position;
Vector2 starttwo = Input.GetTouch(1).position;
if (isEnlarge(startone, starttwo, endone, endtwo))
{
tex.text = "触屏缩放中";
if (desiredDistance < distanceMax)
desiredDistance += 1f;
}
else
{
tex.text = "触屏放大中";
if (desiredDistance > 5f)
desiredDistance -= 1f;
}
endone = startone;
endtwo = starttwo;
}
}

//触屏实现拖拽
if (Input.touchCount == 3)
{
_isFocus = false;
if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved
&& Input.GetTouch(2).phase == TouchPhase.Moved)
{
tex.text = "触屏拖动中";
kTarget.rotation = mTrans.rotation;
kTarget.Translate(Vector2.right * -Input.GetTouch(0).deltaPosition.x *panSpeed);
kTarget.Translate(mTrans.up * -Input.GetTouch(0).deltaPosition.y * panSpeed);
}
}
}
}

//Pc机上控制
if (isPc)
{
//键盘操作,旋转和拖拽
if (Input.GetMouseButton(0))
{
_isFocus = false;
mouseX += Input.GetAxis("Mouse X") * rotateSpeed;
mouseY -= Input.GetAxis("Mouse Y") * rotateSpeed;
tex.text = "键盘旋转中";

}

if (Input.GetMouseButton(1))
{
_isFocus = false;
kTarget.rotation = mTrans.rotation;
kTarget.Translate(Vector2.right * -Input.GetAxis("Mouse X") * panSpeed);
kTarget.Translate(mTrans.up * -Input.GetAxis("Mouse Y") * panSpeed, Space.World);
}

//键盘沿Z轴缩放
float scrollValue = Input.GetAxis("Mouse ScrollWheel");
if (scrollValue != 0)
{
_isFocus = false;
desiredDistance -= scrollValue * scrollSpeed;
tex.text = "键盘控制距离拉近或拉远";
}
}

mouseY = ClampAngle(mouseY, -30f, 30f);
kTarget.position = new Vector3(Mathf.Clamp(kTarget.position.x, -15f, 15f), Mathf.Clamp(kTarget.position.y, -10f, 10f), Mathf.Clamp(kTarget.position.z, -30f, 30f));

//限制距离
if (desiredDistance > distanceMax)
desiredDistance = distanceMax;

if (desiredDistance < 1.25f)
{
desiredDistance = 1.25f;
}

currentRotation = mTrans.rotation;
desiredRotation = Quaternion.Euler(mouseY, mouseX, 0);

Quaternion rotation = Quaternion.Slerp(currentRotation, desiredRotation, Time.deltaTime * 15f);

perDistance = desiredDistance;
perDistance = Mathf.SmoothDamp(lastDistance, perDistance, ref velocityZ, delayZ);
lastDistance = perDistance;

Vector3 position = rotation * new Vector3(0f, 0f, -perDistance) + kTarget.position;
mTrans.rotation = rotation;
mTrans.position = position;

}

float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}

bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
{
float length1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));

if (length1 < length2)
{
return true;
}
else
{
return false;
}
}
}

时间: 2024-10-23 01:57:14

pc,android,iphone三个平台上摄像机复杂操作的相关文章

DES跨(C# Android IOS)三个平台通用的加解密方法

#region   跨平台加解密(c# 安卓 IOS) //  public static string sKey = "12345678"; //  /// <summary> //  /// 解密 //  /// </summary> //  /// <param name="pToDecrypt">要解密的以Base64</param> //  /// <param name="sKey"

C#三个平台上的文件选择方法

wpf: Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = ".txt"; Nullable<bool> result = dlg.ShowDialog(); if (result == true) { // Open document string filename = dlg.FileName; } FileStream aFile =

Android、iPhone和Java三个平台一致的加密工具

先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java.Android和iPhone三个平台加解密不一致的问题. 因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密.头疼的问题就来了,很难编写出一套加密程序,在3个平台间加解密的结果一致,总不能为 Android和iPhone两个客户端各写一套Web Service接口吧?我相信还会有很多朋友为此困惑,

主题:Android、iPhone和Java三个平台一致的加密工具

先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java.Android和iPhone三个平台加解密不一致的问题.因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密.头疼的问题就来了,很难编写出一套加密程序,在3个平台间加解密的结果一致,总不能为Android和iPhone两个客户端各写一套Web Service接口吧?我相信还会有很多朋友为此困惑,在此

Android平台上裁剪m4a

Android手机上设置铃声的操作是比较灵活的,一般读者听到一首喜欢的歌曲,马上就可以对这首歌曲进行裁剪,裁剪到片段后,再通过系统的接口设置为铃声(电话铃声.闹钟铃声等). 前提是,播放这首歌的APP,需要提供裁剪歌曲的功能. 那么,怎么样实现截取音频文件的一个片段的功能呢? 小程很自然就想到使用FFmpeg命令来实现,之前介绍"从视频中提取图片"的内容就可以提取片段,比如: ffmpeg -ss 10 -i audio.mp3 -t 5 out.mp3上面的命令,从第10秒开始,提取

Android平台上抓包

经常会有一些测试需求比如:测试手机上某个app的网络通信是否已经加密,或者测试某个app是否偷偷链接某些网站. 根据抓包的对象,主要有两种途径: 1. 在路由器端抓包:使用一台已经连入路由器的PC来抓取路由器上所有的数据传输信息. 2. 在终端抓包:在终端(手机,平板等)上抓取次终端设备的网络传输信息. 注意:可以很容易通过网络下载到很多可以用来抓包的apk,但是前提是android手机或者终端要root过,笔者试过其中的一.二款,感觉不够理想. 其实网上的这些工具也都是使用tcpdump这款命

[原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框架,其跨平台的特性让它备受开发公司的欢迎.这里我就不做概念性的解释了,通过这篇文章你就会了解到,它的跨平台性”是个什么样子的“---有点拟人化了 我举个比较形象的例子: 有A.B.C三个部落,A部落的语言是A和O语言,B部落的语言是B和O语言,C部落的语言是C和O语言.你作为一个外星球人你会选择去学

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回