Unity 旋轉(zhuǎn)和縮放01-控制模型自身

Unity旋轉(zhuǎn)和縮放02-控制攝像機(jī)

功能:控制模型的大小和旋轉(zhuǎn)

PC & Android:

/***********************
 * 遇見你的眉眼,如清風(fēng)明月杆兵。
 * Title:   "旋轉(zhuǎn)和縮放模型"
 * Func:    
 * -        
 * UsedBy:      
 * Date:    2020
 * Author:  XC
 * Version: 1.0
 * Description: 
 ***********************/
using UnityEngine;
using UnityEngine.UI;

public class ScaleOrRotateModels1 : MonoBehaviour
{
    //最大和最小縮放比例值
    public float maxScale = 2f;
    public float minScale = 0.2f;
    //移動平臺
    private Touch oldTouch1;  //上次觸摸點1(手指1)  
    private Touch oldTouch2;  //上次觸摸點2(手指2)  
    private float newdis = 0;
    private float olddis = 0;
    private float horizontalSpeed = 5;
    private float verticalSpeed = 2.5f;
    private Vector3 rotatePos;
    private Vector3 defaultScale;

    private float ZiShenY;
    private float ZiShenX;

    Vector3 StartPosition;  //左鍵按下時鼠標(biāo)的位置  
    Vector3 previousPosition;  //上一幀鼠標(biāo)的位置顶籽。 
    Vector2 zishen;//自身位置;

    void Start()
    {
        rotatePos = transform.position;
        defaultScale = transform.localScale;
    }

    void LateUpdate()
    {
        if (Application.platform == RuntimePlatform.Android) //移動端
        {
            //單指觸屏滑動,物體的旋轉(zhuǎn)
            if (Input.touchCount == 1)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    //得到手指移動的增量(只有X爆袍、Y值)
                    Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
                    if (Mathf.Abs(touchDeltaPosition.x) >= Mathf.Abs(touchDeltaPosition.y))
                    {
                        if (touchDeltaPosition.x < 0)
                        {
                            transform.RotateAround(rotatePos, Vector3.up, horizontalSpeed);
                        }
                        if (touchDeltaPosition.x > 0)
                        {
                            transform.RotateAround(rotatePos, -Vector3.up, horizontalSpeed);
                        }
                    }
                    else
                    {
                        if (touchDeltaPosition.y < 0)
                        {
                            transform.RotateAround(rotatePos, -Vector3.right, verticalSpeed);
                        }
                        if (touchDeltaPosition.y > 0)
                        {
                            transform.RotateAround(rotatePos, Vector3.right, verticalSpeed);
                        }
                    }
                }
            }

            //兩指觸屏滑動首繁,物體的縮放 
            if (Input.touchCount >= 1)
            {
                //多點觸摸, 放大縮小 
                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;

                //放大因子胁塞, 一個像素按 0.01倍來算(100可調(diào)整)  
                float scaleFactor = offset / 100f;
                Vector3 localScale = transform.localScale;
                Vector3 scale = new Vector3(localScale.x + scaleFactor,
                     localScale.y + scaleFactor,
                     localScale.z + scaleFactor);

                //最小縮放 
                if (scale.x > minScale && scale.y > minScale && scale.z > minScale)
                {
                    transform.localScale = scale;
                }

                //記住最新的觸摸點,下次使用  
                oldTouch1 = newTouch1;
                oldTouch2 = newTouch2;
            }
            
        }
        else //pc端
        {
            //鼠標(biāo)左鍵压语,物體旋轉(zhuǎn)
            if (Input.GetMouseButton(1))
            {
                //11111111
                //Vector3 fwd = Camera.main.transform.forward;
                //fwd.Normalize();

                //Vector3 vaxis = Vector3.Cross(fwd, Vector3.right);
                //transform.Rotate(vaxis, - Input.GetAxis("Mouse X")*5f, Space.World);
                ////transform.Rotate(vaxis, -Input.GetAxis("Mouse X") * 5f, Space.Self);

                //Vector3 haxis = Vector3.Cross(fwd, Vector3.up);
                //transform.Rotate(haxis, Input.GetAxis("Mouse Y") * -5f, Space.World);
                ////transform.Rotate(haxis, Input.GetAxis("Mouse Y") * -5f, Space.Self);

                //22222222
                //ZiShenY = this.transform.localEulerAngles.y;
                //ZiShenX = this.transform.localEulerAngles.x;

                //float h = Input.GetAxis("Mouse X") * Time.deltaTime;//右正左負(fù) 
                //float v = Input.GetAxis("Mouse Y") * Time.deltaTime;//上正下負(fù) 

                //if (Mathf.Abs(h) >= Mathf.Abs(v))
                //{

                //    if (h < 0)//左右
                //    {
                //        transform.RotateAround(rotatePos, Vector3.up, horizontalSpeed);
                //        float zz = transform.localEulerAngles.y;
                //        this.transform.localEulerAngles = new Vector3(ZiShenX, zz + 5f, 0);
                //    }
                //    if (h > 0)
                //    {

                //        transform.RotateAround(rotatePos, -Vector3.up, horizontalSpeed);
                //        float zz = transform.localEulerAngles.y;
                //        this.transform.localEulerAngles = new Vector3(ZiShenX, zz - 5f, 0);
                //    }
                //}
                //else//上下
                //{
                //    this.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, ZiShenY, 0), Time.deltaTime * 5f);
                //    if (v < 0)
                //    {
                //        transform.RotateAround(rotatePos, -Vector3.right, verticalSpeed);
                //        float zz = transform.localEulerAngles.x;
                //        this.transform.localEulerAngles = new Vector3(zz + 5f, ZiShenY, 0);
                //    }
                //    if (v > 0)
                //    {
                //        transform.RotateAround(rotatePos, Vector3.right, verticalSpeed);
                //        float zz = transform.localEulerAngles.x;
                //        this.transform.localEulerAngles = new Vector3(zz - 5f, ZiShenY, 0);

                //    }
                //}

                //3333333333
                float h = Input.GetAxis("Mouse X");//右正左負(fù) 
                float v = Input.GetAxis("Mouse Y");//上正下負(fù) 
                if (Mathf.Abs(h) >= Mathf.Abs(v))
                {
                    if (h < 0)
                    {
                        transform.RotateAround(transform.position, Vector3.up, horizontalSpeed);
                    }
                    if (h > 0)
                    {
                        transform.RotateAround(transform.position, -Vector3.up, horizontalSpeed);
                    }
                }
                else
                {
                    if (v < 0)
                    {
                        transform.RotateAround(transform.position, -Vector3.right, verticalSpeed);
                    }
                    if (v > 0)
                    {
                        transform.RotateAround(transform.position, Vector3.right, verticalSpeed);
                    }
                }
            }
            //控制放大縮小
            if (Input.GetAxis("Mouse ScrollWheel") < 0 && transform.localScale.x > minScale)
            {
                transform.localScale -= defaultScale * Time.deltaTime * 2;
            }
            else if (Input.GetAxis("Mouse ScrollWheel") > 0 && transform.localScale.x < maxScale)
            {
                transform.localScale += defaultScale * Time.deltaTime * 2;
            }
        }
    }
}

[圖片上傳中...(image.png-a4c8ea-1623829076826-0)]

/***********************
 * 遇見你的眉眼啸罢,如清風(fēng)明月。
 * Title:   "移動端控制攝像機(jī)"
 * Func:    1胎食、平移攝像機(jī)
 *          2扰才、推進(jìn)、拉遠(yuǎn)攝像機(jī)(近大遠(yuǎn)小厕怜,效果:模型縮放)
 * -        3衩匣、旋轉(zhuǎn)攝像機(jī)
 * UsedBy:      
 * Date:    2020
 * Author:  XC
 * Version: 1.0
 * Description: 
 ***********************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using DG.Tweening;
public class CameraController_xc : MonoBehaviour
{
    bool isRotate;
    //移動端
    private Touch oldTouch1;  //上次觸摸點1(手指1)  
    private Touch oldTouch2;  //上次觸摸點2(手指2)  
    
    public float MoveSpeed,RotateSpeed;  //移動端拖動速度、旋轉(zhuǎn)速度

    //pc端
    public float ScrollWheelSpeed_pc; //鼠標(biāo)滾輪速度
    public float MoveSpeed_pc, RotateSpeed_pc;

    private Vector3 MouseDownPos;

    void Start()
    {
        isRotate = true;

        MoveSpeed = 3f;
        RotateSpeed = 2f;

        ScrollWheelSpeed_pc = 10f;
        MoveSpeed_pc = 10f;
        RotateSpeed_pc = 1f;
    }

    void Update()
    {
#if UNITY_ANDROID
        //沒有觸摸  
        if (Input.touchCount <= 0)
        {
            return;
        }
        //單點觸摸
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            
            //得到手指移動的增量(只有X酣倾、Y值)
            Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
            //if (!isRotate)
            //{
            //    //相機(jī)移動
            //    transform.Translate(-touchDeltaPosition.x * Time.deltaTime * MoveSpeed,
            //        -touchDeltaPosition.y * Time.deltaTime * MoveSpeed, 0);
            //}
            //else
            //{
                //相機(jī)旋轉(zhuǎn)
                if (Mathf.Abs(touchDeltaPosition.y) > Mathf.Abs(touchDeltaPosition.x))
                {
                    if (touchDeltaPosition.y > 0)
                    {
                        transform.Rotate(-touchDeltaPosition.y * Time.deltaTime * RotateSpeed, 0, 0);
                    }
                    else
                    {
                         transform.Rotate(-touchDeltaPosition.y * Time.deltaTime * RotateSpeed, 0, 0);
                    }
                }
                else
                {
                    if (touchDeltaPosition.x > 0)
                    {
                        transform.Rotate(0, touchDeltaPosition.x * Time.deltaTime * RotateSpeed, 0, Space.World);
                    }
                    else
                    {
                        transform.Rotate(0, touchDeltaPosition.x * Time.deltaTime * RotateSpeed, 0, Space.World);
                    }
                }
            //}
        }
        else if (Input.touchCount >= 1)
        {
            //多點觸摸, 放大縮小 
            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;
            float scaleFactor = offset / 100f;

            transform.position += transform.localRotation * (Vector3.forward * scaleFactor);


            //記住最新的觸摸點映之,下次使用  
            oldTouch1 = newTouch1;
            oldTouch2 = newTouch2;
        }
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
        //滾輪前進(jìn)后退放大縮小
        float scrollWheelValue = Input.GetAxis("Mouse ScrollWheel");
        transform.position += transform.localRotation * (Vector3.forward * 
            scrollWheelValue * ScrollWheelSpeed_pc);
        //wasd控制移動
        float hor = Input.GetAxis("Horizontal");
        float ver = Input.GetAxis("Vertical");
        float hor2 = Input.GetAxis("Horizontal2");
        float ver2 = Input.GetAxis("Vertical2");
        if (ver!=0||hor!=0)
        {
            transform.Translate(hor * MoveSpeed_pc * Time.deltaTime, 0, ver * MoveSpeed_pc * Time.deltaTime);
        }
        if (ver2 != 0 || hor2 != 0)
        {
            transform.Rotate(-ver2 * MoveSpeed_pc * Time.deltaTime, 0, 0);
            transform.Rotate(0, hor2 * MoveSpeed_pc * Time.deltaTime, 0, Space.World);
        }
        //右鍵旋轉(zhuǎn)
        if (Input.GetMouseButton(1))
        {
            float h = Input.GetAxis("Mouse X");//右正左負(fù) 
            float v = Input.GetAxis("Mouse Y");//上正下負(fù) 
            if (Mathf.Abs(h) >= Mathf.Abs(v))
            {
                if (h < 0)
                {
                    transform.Rotate(-Vector3.up, RotateSpeed_pc,Space.World);
                }
                if (h > 0)
                {
                    transform.Rotate(Vector3.up, RotateSpeed_pc,Space.World);
                }
            }
            else
            {
                if (v < 0)
                {
                    transform.Rotate(Vector3.right, RotateSpeed_pc);
                }
                if (v > 0)
                {
                    transform.Rotate(-Vector3.right, RotateSpeed_pc);
                }
            }
        }
        
        // 鼠標(biāo)中鍵拖動相機(jī).
        if (Input.GetMouseButton(2))
        {
            float X = Input.GetAxis("Mouse X");
            float Y = Input.GetAxis("Mouse Y");
            //相機(jī)移動
            transform.Translate(-X * Time.deltaTime * MoveSpeed_pc,
                -Y * Time.deltaTime * MoveSpeed_pc, 0);
        }
#endif
    }
}

將wasd和小鍵盤上下左右分開了.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拦焚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杠输,更是在濱河造成了極大的恐慌赎败,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢甲,死亡現(xiàn)場離奇詭異僵刮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹦牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門搞糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曼追,你說我怎么就攤上這事窍仰。” “怎么了礼殊?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵驹吮,是天一觀的道長针史。 經(jīng)常有香客問我,道長碟狞,這世上最難降的妖魔是什么啄枕? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮篷就,結(jié)果婚禮上射亏,老公的妹妹穿的比我還像新娘近忙。我一直安慰自己竭业,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布及舍。 她就那樣靜靜地躺著未辆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锯玛。 梳的紋絲不亂的頭發(fā)上咐柜,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音攘残,去河邊找鬼拙友。 笑死,一個胖子當(dāng)著我的面吹牛歼郭,可吹牛的內(nèi)容都是我干的遗契。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼病曾,長吁一口氣:“原來是場噩夢啊……” “哼牍蜂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泰涂,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲫竞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逼蒙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體从绘,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年是牢,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵井。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡妖泄,死狀恐怖驹沿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹈胡,我是刑警寧澤渊季,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布朋蔫,位于F島的核電站,受9級特大地震影響却汉,放射性物質(zhì)發(fā)生泄漏驯妄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一合砂、第九天 我趴在偏房一處隱蔽的房頂上張望青扔。 院中可真熱鬧,春花似錦翩伪、人聲如沸微猖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凛剥。三九已至,卻和暖如春轻姿,著一層夾襖步出監(jiān)牢的瞬間犁珠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工互亮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留犁享,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓豹休,卻偏偏與公主長得像炊昆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慕爬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容