天天看點

unity3d實作LOL中的相機控制功能

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    private int SightDistancespeed = 15;
    private bool CameraIsLock = false; //相機是否鎖定
    private float RectSize = 50f; //矩形大小
    private float CameraMoveSpeed=0.5f; //相機移動速度
    private Transform Player; //player的Transform
    private float CamerafieldOfView=60; //相機的錐形視野範圍
    private Camera camera; //相機

    //螢幕邊緣四個矩形
    private Rect RectUp;
    private Rect RectDown;
    private Rect RectLeft;
    private Rect RectRight;
	void Start () {
        //執行個體化螢幕邊緣的四個矩形出來
         RectUp = new Rect(0,Screen.height-RectSize,Screen.width,Screen.height);
         RectDown = new Rect(0,0,Screen.width,RectSize);
         RectLeft = new Rect(0,0,RectSize,Screen.width);
         RectRight = new Rect(Screen.width-RectSize,0,Screen.width,Screen.height);

           
<span style="white-space:pre">	</span>//在場景内查找Tag為Player的物體
         Player = GameObject.FindGameObjectWithTag("Player").transform;
		 
        
         camera = this.GetComponent<Camera>();
	
	}
	
	
	void Update () {

        //如果按下Y鍵鎖定相機再次按下解鎖。
        if(Input.GetKeyDown(KeyCode.Y))
        {
            CameraIsLock = !CameraIsLock;
        }

        
        CameraMoveAndLock();//視角移動和鎖定
        SightDistance();//視距的縮放
	  
	}
    //視角移動
    void CameraMoveAndLock()
    {
        //空格回到自己
        if (Input.GetKey(KeyCode.Space))
        {
            transform.position = new Vector3(Player.position.x, transform.position.y, Player.position.z - 5f);
        }
        //如果沒有鎖定相機(視野)可以移動
        if(CameraIsLock==false)
        {
            //如果滑鼠在螢幕上的位置包含在這個矩形裡
            if (RectUp.Contains(Input.mousePosition))
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + CameraMoveSpeed);
            }
            if (RectDown.Contains(Input.mousePosition))
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - CameraMoveSpeed);
            }
            if (RectLeft.Contains(Input.mousePosition))
            {
                transform.position = new Vector3(transform.position.x - CameraMoveSpeed, transform.position.y, transform.position.z);
            }
            if (RectRight.Contains(Input.mousePosition))
            {
                transform.position = new Vector3(transform.position.x + CameraMoveSpeed, transform.position.y, transform.position.z);
            }
            //判斷相機移動的邊緣在哪裡,不能 超過設定的最遠距離
            if (transform.position.z >= 70f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, 70f);
            }
            if (transform.position.z <= -80f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -80f);
            }
            if (transform.position.x >= -5)
            {
                transform.position = new Vector3(-5, transform.position.y, transform.position.z);
            }
            if (transform.position.x <= -200f)
            {
                transform.position = new Vector3(-200, transform.position.y, transform.position.z);
            }
        }
        else if (CameraIsLock == true)
        {
            //如果鎖定視角,相機視野顯示主角
            transform.position = new Vector3(Player.position.x, transform.position.y, Player.position.z - 5f);
        }
        
    }


    //中鍵滑輪拉遠拉近
    void SightDistance()
    {
        float MouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");

        CamerafieldOfView += MouseScrollWheel * -SightDistancespeed;
        CamerafieldOfView = Mathf.Clamp(CamerafieldOfView, 30, 60);
        camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, CamerafieldOfView, Time.deltaTime * SightDistancespeed);
       
    }
}
           

繼續閱讀