【Unity 实战记录】(一)摄像机区域内跟随物体

模仿Cinemachined 效果,用Cinemachine可轻松实现,贴代码

  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using UnityEngine;
  4 
  5 public class FiveCameraController : MonoBehaviour
  6 {
  7 
  8 
  9     public Transform targetPlayer;
 10 
 11     private Vector3 centerPos = Vector3.zero;
 12     private float borderRadius = 27f;
 13     private float moveRadius = 0.4f;
 14 
 15     private bool isInitPos = false;
 16     private Camera camera1;
 17     // Use this for initialization
 18     void Start()
 19     {
 20         //相机为正交模式
 21         camera1 = GetComponent<Camera>();
 22         camera1.orthographicSize = 8;
 23         borderRadius -= camera1.orthographicSize;
 24         moveRadius *= camera1.orthographicSize;
 25     }
 26 
 27     // Update is called once per frame
 28     void Update()
 29     {
 30         if (targetPlayer == null)
 31         {
 32             return;
 33         }
 34         if (!isInitPos)
 35         {
 36             
 37             transform.position = setPosInArea(targetPlayer.position);
 38             isInitPos = true;
 39         }
 40 
 41         Vector3 offset = getMoveOffset(targetPlayer.position);
 42         if (Vector3.zero != offset)
 43         {
 44             transform.position += offset;
 45             transform.position = setPosInArea(transform.position);
 46            
 47         }
 48         
 49     }
 50     /// <summary>
 51     /// 区域限制
 52     /// </summary>
 53     /// <param name="pos"></param>
 54     /// <returns></returns>
 55     public Vector3 setPosInArea(Vector3 pos)
 56     {
 57 
 58         if (pos.x > centerPos.x && pos.x > centerPos.x + borderRadius)
 59         {
 60             pos.x = centerPos.x + borderRadius;
 61         }
 62         if (pos.x < centerPos.x && pos.x < centerPos.x - borderRadius)
 63         {
 64             pos.x = centerPos.x - borderRadius;
 65         }
 66         if (pos.y > centerPos.y && pos.y > centerPos.y + borderRadius)
 67         {
 68             pos.y = centerPos.y + borderRadius;
 69         }
 70         if (pos.y < centerPos.y && pos.y < centerPos.y - borderRadius)
 71         {
 72             pos.y = centerPos.y - borderRadius;
 73         }
 74 
 75         return pos;
 76     }
 77     /// <summary>
 78     /// 得到移动插值
 79     /// </summary>
 80     /// <param name="pos"></param>
 81     /// <returns></returns>
 82     public Vector3 getMoveOffset(Vector3 pos)
 83     {
 84         Vector3 cameraPos = transform.position;
 85         Vector3 offset = Vector3.zero;
 86         if (pos.x > cameraPos.x && pos.x > cameraPos.x + moveRadius)
 87         {
 88             offset.x = pos.x - (cameraPos.x + moveRadius);
 89         }
 90         if (pos.x < cameraPos.x && pos.x < cameraPos.x - moveRadius)
 91         {
 92             offset.x = pos.x - (cameraPos.x - moveRadius);
 93         }
 94         if (pos.y > cameraPos.y && pos.y > cameraPos.y + moveRadius)
 95         {
 96             offset.y = pos.y - (cameraPos.y + moveRadius);
 97         }
 98         if (pos.y < cameraPos.y && pos.y < cameraPos.y - moveRadius)
 99         {
100             offset.y = pos.y - (cameraPos.y - moveRadius);
101         }
102         return offset;
103 
104     }
105     public void SetTargetPlayer(Transform player)
106     {
107         this.targetPlayer = player;
108 
109 
110     }
111 }

效果:

posted @ 2018-12-06 11:52  2z1h5  阅读(725)  评论(0编辑  收藏  举报