blob: f439cf22f90f5ee49598e0940cb667eb0218de6c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 主相机
[ExecuteAlways]
public class MainCamera : SingletonMB<MainCamera>
{
#region inspector
[Serializable]
public struct Region
{
[SerializeField] public float l;
[SerializeField] public float r;
[SerializeField] public float t;
[SerializeField] public float b;
}
public new Camera camera { get; private set; }
public Vector3 offset = Vector3.zero;
[SerializeField] private float z;
[SerializeField] private Region region;
[SerializeField] private float moveSpeed;
[SerializeField] private AnimationCurve speedCurve;
[SerializeField] private float threshold;
#endregion
private LensEffectHandler m_LensEffectHandler;
public LensEffectHandler lensEffectHandler
{
get
{
if (m_LensEffectHandler == null)
m_LensEffectHandler = this.gameObject.GetOrAddComponent<LensEffectHandler>();
return m_LensEffectHandler;
}
}
private Vector2 position2D
{
get
{
return transform.position;
}
set
{
transform.position = new Vector3(value.x, value.y, transform.position.z);
}
}
private Vector3 position
{
get
{
return transform.position;
}
set
{
transform.position = value;
}
}
protected override void Awake()
{
base.Awake();
camera = gameObject.GetComponent<Camera>();
}
private void Start()
{
Vector3 pos = transform.position;
pos.z = this.z;
transform.position = pos;
Quaternion rot = Quaternion.LookRotation(Vector3.forward);
transform.rotation = rot;
}
void FollowPlayerCharacter()
{
if (UnitManager.Instance == null || UnitManager.Instance.pc == null)
return;
Region region = this.region;
//if (!UnitManager.Instance.pc.isTowardRight)
//{
// region.l = -this.region.r;
// region.r = -this.region.l;
//}
Vector3 camPos = position;
Vector3 worldPos = UnitManager.Instance.pc.transform.position + offset;
Vector2 viewPos = ((Vector2)camera.WorldToViewportPoint(worldPos)) * 2 - Vector2.one;
Vector3 dir = (worldPos - camPos).normalized;
float dest = (worldPos - camPos).magnitude;
float curve = speedCurve.Evaluate((threshold - Mathf.Clamp(dest, 0f, threshold)) / threshold);
Vector3 move = curve * dir * moveSpeed * Time.deltaTime;
if (IsInRegion(viewPos, region))
{
if(!IsInCenter(viewPos))
{
position2D = camPos + move;
if((worldPos - position).magnitude <= 0.1f)
{
position2D = worldPos;
}
}
return;
}
position2D = camPos + move;
if ((worldPos - position).magnitude <= 0.1f)
{
position2D = worldPos;
}
}
bool IsInRegion(Vector2 p, Region region)
{
return p.x > region.l
&& p.x < region.r
&& p.y > region.b
&& p.y < region.t;
}
bool IsInCenter(Vector2 p)
{
return p.x == (region.l + region.r) / 2 && p.y == (region.t + region.b) / 2;
}
void Update()
{
FollowPlayerCharacter();
}
public void OnGUI()
{
if(MainCameraDebug.OnGUIHandlers != null)
MainCameraDebug.OnGUIHandlers.Invoke();
}
}
|