using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScaleAndRotate : MonoBehaviour
{
/*app,手指觸摸(Touc)屏幕,腳本掛載在相機(jī),旋轉(zhuǎn)相機(jī)查看物體,并限制角度和拉近距離,腳本掛載在相機(jī)
*/
public GameObject target;//目標(biāo)移動物體
private Touch oldTouch1; //上次觸摸點1(手指1)
private Touch oldTouch2; //上次觸摸點2(手指2)
private float eulerAngles_x;
private float eulerAngles_y;
//水平滾動相關(guān)
public float xSpeed = 5.0f;//主相機(jī)水平方向旋轉(zhuǎn)速度
//垂直滾動相關(guān)
public int yMaxLimit = 90;//最大y(單位是角度)
public int yMinLimit = -90;//最小y(單位是角度)
public float ySpeed = 10.0f;//主相機(jī)縱向旋轉(zhuǎn)速度
void Start()
{
Vector3 eulerAngles = this.transform.eulerAngles;//當(dāng)前物體的歐拉角
this.eulerAngles_x = eulerAngles.y;
this.eulerAngles_y = eulerAngles.x;
}
void Update()
{
//沒有觸摸
if (Input.touchCount <= 0)
{
return;
}
//單點觸摸, 水平上下旋轉(zhuǎn)
if (1 == Input.touchCount)
{
Touch touch = Input.GetTouch(0);
Vector2 deltaPos = touch.deltaPosition;
//無死角旋轉(zhuǎn)
//transform.RotateAround(target.transform.position, Vector3.up, deltaPos.x);
//transform.RotateAround(target.transform.position, -1 * transform.right, deltaPos.y);
float sum = Vector3.Distance(this.transform.position, target.transform.position);
if (this.target != null)
{
this.eulerAngles_x += ((deltaPos.x * this.xSpeed) * sum) * 0.005f;
this.eulerAngles_y -= (deltaPos.y * this.ySpeed) * 0.005f;
this.eulerAngles_y = ClampAngle(this.eulerAngles_y, (float)this.yMinLimit, (float)this.yMaxLimit);
Quaternion quaternion = Quaternion.Euler(this.eulerAngles_y, this.eulerAngles_x, (float)0);
Vector3 vector = ((Vector3)(quaternion * new Vector3((float)0, (float)0, -sum))) + this.target.transform.position;
//更改主相機(jī)的旋轉(zhuǎn)角度和位置
this.transform.rotation = quaternion;
this.transform.position = vector;
}
}
//多點觸摸, 放大縮小
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
//第2點剛開始接觸屏幕, 只記錄,不做處理
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
//計算老的兩點距離和新的兩點間距離,變大要放大模型,變小要縮放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
//兩個距離之差,為正表示放大手勢, 為負(fù)表示縮小手勢
float offset = newDistance - oldDistance;
// DebugUtil.log("物體之間的距離:" + Vector3.Distance(this.transform.position, target.transform.position));
if (offset > 0 && Vector3.Distance(this.transform.position, target.transform.position) > 4)
{
transform.Translate(Vector3.forward * 0.1f);
}
if (offset < 0 && Vector3.Distance(this.transform.position, target.transform.position) < 10)
{
transform.Translate(Vector3.forward * -0.1f);
}
//記住最新的觸摸點,下次使用
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
}
//把角度限制到給定范圍內(nèi)
public float ClampAngle(float angle, float min, float max)
{
while (angle < -360)
{
angle += 360;
}
while (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle, min, max);
}
}
unity--Android旋轉(zhuǎn)相機(jī)查看物體,并限制角度和拉近距離
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 第一種:這個比較笨,但是也能實現(xiàn) 建立一個Cube,將該腳本掛到Cube上就可以了 int RotateSpeed...
- 主要涉及函數(shù) Input.GetAxis(“Mouse x”) 可取得鼠標(biāo)橫向(x軸)移動增量 Input.Get...
- 最近看《余罪》,頗有感慨,可能是我太中規(guī)中矩,總覺得電視劇反映的價值觀有誤導(dǎo)青少年的傾向。 主人公余罪是個...