Files
MetalGear2D.Unity/Assets/Materials/CameraMotionController.cs
T
2025-05-13 05:19:58 +03:00

106 lines
2.5 KiB
C#

using UnityEngine;
using System.Collections;
public class CameraMotionController : MonoBehaviour {
public GameObject player;
public float staticRectangleWidth = 200;
public float staticRectangleHeight = 200;
public bool drawDebug = true;
private Camera camera;
private Rect staticRect;
public bool SpritePixels = true;
public PixelPerfectCamera pixelController;
// Use this for initialization
void Start () {
camera = gameObject.GetComponent<Camera>();
staticRect = new Rect();
}
// Update is called once per frame
void LateUpdate () {
UpdateRectangle();
MoveCameraToPlayer();
}
void OnLevelWasLoaded(int level) {
Debug.LogWarning("Loaded level: " + level);
}
void MoveCameraToPlayer(){
var pb = player.GetComponent<SpriteRenderer>().bounds;
var playerRect = Tools.BoundsToRect(pb);
Vector3 offset = Vector3.zero;
var rightOffset = staticRect.xMax - playerRect.xMax;
var leftOffset = staticRect.xMin - playerRect.xMin;
var topOffset = staticRect.yMax - playerRect.yMax;
var bottomOffset = staticRect.yMin - playerRect.yMin;
if(rightOffset < 0){
offset -= Vector3.right * rightOffset;
}
if(leftOffset > 0){
offset -= Vector3.right * leftOffset;
}
if(bottomOffset > 0){
offset -= Vector3.up * bottomOffset;
}
if(topOffset < 0){
offset -= Vector3.up * topOffset;
}
transform.position += offset * Time.deltaTime * 5;
}
void UpdateRectangle(){
float camUnitHeight = camera.orthographicSize * 2;
float camPixelsToUnits = camUnitHeight / camera.pixelHeight;
float unitHW = staticRectangleWidth * 0.5f * camPixelsToUnits;
float unitHH = staticRectangleHeight * 0.5f * camPixelsToUnits;
if(SpritePixels && pixelController != null){
unitHW *= pixelController.zoom;
unitHH *= pixelController.zoom;
}
Vector2 center = transform.position;
staticRect.x = center.x - unitHW;
staticRect.y = center.y - unitHH;
staticRect.width = unitHW * 2;
staticRect.height = unitHH * 2;
}
void OnDrawGizmosSelected(){
if(staticRect == null){
staticRect = new Rect();
}
if(camera == null){
camera = gameObject.GetComponent<Camera>();
}
UpdateRectangle();
if(drawDebug){
var pb = player.GetComponent<SpriteRenderer>().bounds;
var rect = new Rect(pb.min.x, pb.min.y, pb.max.x - pb.min.x, pb.max.y - pb.min.y);
//Tools.BeginGui(false);
bool i = staticRect.Overlaps(rect);
Tools.DrawRectangle(staticRect, i ? new Color(0,1,0,0.3f) : new Color(1,0,0,0.3f));
//Tools.EndGui();
}
}
}