zoukankan      html  css  js  c++  java
  • Unity C# 一些关于Camera的心得!

    本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6856374.html

    首先,总结了下最近工作中关于摄像机漫游的功能,

    脚本如下:

      1     Transform _Camera;
      2     public LayerMask mask;
      3      
      4     public float checkHeight = 500f;
      5     public float minHeight = 20f;
      6     public float maxHeight = 8000f;
      7     public float minClamp = 50f;
      8     public float maxClamp = 950f;
      9 
     10     public float sensitivityX = 5f;
     11     public float sensitivityY = 5f;
     12     private float rotationY = 0f;
     13 
     14     //上下最大Y视角
     15     public float minimumY = -90f;
     16     public float maximumY = 30f;
     17 
     18     public Vector3 PreMouseMPos;
     19 
     20     public float scrollSpeed = 200f;
     21 
     22     void Start () 
     23     {
     24         mask.value = 1;
     25         _Camera = Camera.main.transform;
     26     }
     27     
     28     // Update is called once per frame
     29     void Update ()
     30     {
     31         if(Input.GetKey(KeyCode.LeftAlt))
     32         {
     33             MouseScrollWheel ();
     34             CameraMove ();
     35             MoveEulerAngles ();
     36         }
     37     }
     38 
     39     /// <summary>
     40     /// Checks the height of the low.
     41     /// </summary>
     42     void CheckLowHeight()
     43     {
     44         if (_Camera.position.x < minClamp)
     45             _Camera.position = new Vector3 (minClamp, _Camera.position.y, _Camera.position.z);
     46         if (_Camera.position.x > maxClamp)
     47             _Camera.position = new Vector3 (maxClamp, _Camera.position.y, _Camera.position.z);
     48         if (_Camera.position.z < minClamp)
     49             _Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, minClamp);
     50         if (_Camera.position.z > maxClamp)
     51             _Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, maxClamp);
     52 
     53         RaycastHit hit;
     54         if(Physics.Raycast(_Camera.position+Vector3.up*checkHeight,Vector3.down,out hit ,checkHeight+minHeight,mask))
     55         {
     56             if(_Camera.position.y-hit.point.y<minClamp)
     57             {
     58                 Vector3 lowPoint = hit.point + new Vector3 (0, minHeight, 0);
     59                 _Camera.position = lowPoint;
     60             }
     61         }
     62     }
     63 
     64     /// <summary>
     65     /// Mouses the scroll wheel.
     66     /// </summary>
     67     private void MouseScrollWheel()
     68     {
     69         if(Input.GetAxis("Mouse ScrollWheel")!=0)
     70         {
     71             _Camera.Translate (new Vector3 (0, 0, Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * scrollSpeed));
     72         }
     73 
     74         CheckLowHeight ();
     75 
     76         if (_Camera.position.y >= maxHeight)
     77             _Camera.position = new Vector3 (_Camera.position.x, maxHeight, _Camera.position.z);
     78     }
     79 
     80     /// <summary>
     81     /// Cameras the move.
     82     /// </summary>
     83     private void CameraMove()
     84     {
     85         if(Input.GetMouseButton(0))
     86         {
     87             if(PreMouseMPos.x<=0)
     88             {
     89                 PreMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0);
     90             }
     91             else
     92             {
     93                 Vector3 CurMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0);
     94                 Vector3 offset = CurMouseMPos - PreMouseMPos;
     95                 offset = -offset * 0.5f * 2;
     96                 if((_Camera.position+offset).y>=minHeight
     97                     &&(_Camera.position+offset).y<=maxHeight)
     98                 {
     99                     _Camera.Translate(offset);
    100 
    101                     CheckLowHeight();
    102 
    103                     PreMouseMPos = CurMouseMPos;
    104                 }
    105             }                
    106         }
    107         else
    108             PreMouseMPos = Vector3.zero;
    109     }
    110 
    111     /// <summary>
    112     /// Moves the euler angles.
    113     /// </summary>
    114     private void MoveEulerAngles()
    115     {
    116         if(Input.GetMouseButton(1))
    117         {
    118             float rotationX = _Camera.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX;
    119 
    120             rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
    121 
    122             rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
    123 
    124             _Camera.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
    125         }
    126     }
    MoveRocket

    第二个是关于摄像机的限制范围和遇到障碍物自动变换与target的距离的功能

    代码如下:

      1 public Transform target;
      2 
      3     public LayerMask mask = new LayerMask();
      4 
      5     public Vector2 targetOffset = new Vector2();
      6     public Vector2 originRotation = new Vector2();
      7 
      8     public float distance = 5;
      9     public float minDistance = 0;
     10     public float maxDistance = 10;
     11 
     12     public Vector2 sensitivity = new Vector2(3, 3);
     13 
     14     public float zoomSpeed = 1;
     15     public float zoomSmoothing = 16;
     16 
     17     public float minAngle = -90;
     18     public float maxAngle = 90;
     19 
     20     private float _zoom_in_timer = 0;
     21     private float _zoom_out_timer = 0;
     22 
     23     private float _wanted_distance;
     24     private Quaternion _rotation;
     25     private Vector2 _input_rotation;
     26 
     27     private Transform _t;
     28 
     29     void Start()
     30     {
     31         mask.value = 1;
     32         _t = transform;
     33         _wanted_distance = distance;
     34         _input_rotation = originRotation; 41     }
     42 
     43     void Update()
     44     {
     45         if (target) {
     46 
     47             if (Input.GetMouseButton (0) || Input.GetMouseButton (1)) {
     48                 if (Input.GetAxis ("Mouse X") != 0 || Input.GetAxis ("Mouse Y") != 0) {
     49                     if (!Cursor.visible) {
     50                         Cursor.visible = false;
     51                         Cursor.lockState = CursorLockMode.Locked;
     52                     }
     53                 }
     54 
     55                 return;
     56             }
     57         }
     58 
     59 
     60         if (!Cursor.visible) {
     61             Cursor.visible = true;
     62             Cursor.lockState = CursorLockMode.None;
     63         }
     64 
     65     }
     66     void FixedUpdate()
     67     {
     68         if(target)
     69         {
     70 
     71             // Zoom control
     72             if(Input.GetAxis("Mouse ScrollWheel") < 0 )
     73             {
     74                 _wanted_distance += zoomSpeed;
     75             }
     76             else if(Input.GetAxis("Mouse ScrollWheel") > 0 )
     77             {
     78                 _wanted_distance -= zoomSpeed;
     79             }
     80 
     81 
     82             _wanted_distance = Mathf.Clamp(_wanted_distance, minDistance, maxDistance);
     83 
     84 
     85             if (Input.GetMouseButton (0) || Input.GetMouseButton (1)) {
     86 
     87                 _input_rotation.x += Input.GetAxis ("Mouse X") * sensitivity.x;
     88 
     89 
     90                 ClampRotation ();
     91 
     92 
     93                 _input_rotation.y -= Input.GetAxis ("Mouse Y") * sensitivity.y;
     94 
     95 
     96                 _input_rotation.y = Mathf.Clamp (_input_rotation.y, minAngle, maxAngle);
     97 
     98                 _rotation = Quaternion.Euler (_input_rotation.y, _input_rotation.x, 0);
     99 
    100             }
    101 
    102             // Lerp from current distance to wanted distance
    103             distance = Mathf.Clamp(Mathf.Lerp(distance, _wanted_distance, Time.deltaTime * zoomSmoothing), minDistance, maxDistance);
    104 
    105             // Set wanted position based off rotation and distance
    106             Vector3 wanted_position = _rotation * new Vector3(targetOffset.x, 0, -_wanted_distance - 0.2f) + target.position + new Vector3(0, targetOffset.y, 0);
    107             Vector3 current_position = _rotation * new Vector3(targetOffset.x, 0, 0) + target.position + new Vector3(0, targetOffset.y, 0);
    108 
    109 
    110             // Linecast to test if there are objects between the camera and the target using collision layers
    111             RaycastHit hit;
    112 
    113             if(Physics.Linecast(current_position, wanted_position, out hit, mask))
    114             {
    115                 distance = Vector3.Distance(current_position, hit.point) - 0.2f;
    116             }
    117 
    118 
    119             // Set the position and rotation of the camera
    120             _t.position = _rotation * new Vector3(targetOffset.x, 0.0f, -distance) + target.position + new Vector3(0, targetOffset.y, 0);
    121             _t.rotation = _rotation;
    122         }
    123     }
    124 
    125     private void ClampRotation()
    126     {
    127         if(originRotation.x < -180)
    128         {
    129             originRotation.x += 360;
    130         }
    131         else if(originRotation.x > 180)
    132         {
    133             originRotation.x -= 360;
    134         }
    135 
    136         if(_input_rotation.x - originRotation.x < -180)
    137         {
    138             _input_rotation.x += 360;
    139         }
    140         else if(_input_rotation.x - originRotation.x > 180)
    141         {
    142             _input_rotation.x -= 360;
    143         }
    144     }
  • 相关阅读:
    js数组和数组去重的几种简单的方法
    nodejs项目的model操作mongo
    canvas画布
    bson
    神奇的东西
    sql与nosql
    mong大牛的blog
    mongo 增删改查
    Mongo配置基础
    session放数据库里解决丢失的问题
  • 原文地址:https://www.cnblogs.com/AdvancePikachu/p/6856374.html
Copyright © 2011-2022 走看看