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
|
//rts方式镜头移动 旋转 缩放控制 javascript
var ZoomSpeed = 30;//镜头缩放速率
var MovingSpeed = 1;//镜头移动速率
var RotateSpeed = 1; //镜头旋转速率
private var distance = 0.0f;//保存镜头和中心点的直线距离
function Start () {
//先用镜头斜视的角度和离地面的高度算出距离视野中心的直线距离
//要省事也可以直接指定一个距离 这个不重要
//镜头的高度可以减去一个修正值 这样就是正视地图上方的效果 看需要
distance = Mathf.Abs(transform.position.y/Mathf.Sin(transform.eulerAngles.x));
}
function LateUpdate () {
var rotation;
var position;
//按住鼠标左键移动鼠标拖动镜头,改成键盘输入或者鼠标靠近屏幕边缘输入都是可以的
if(Input.GetMouseButton(0))
{
var delta_x = Input.GetAxis("Mouse X") * MovingSpeed;
var delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;
//镜头其实就是在平行地面的水平面上四处移动 所以构造一个变换矩阵 与世界坐标唯一的差异就是y轴旋转的角度
rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y,0 );
//把镜头要移动的分量乘以这个变化矩阵就是相对世界坐标的移动量啦 再加上镜头当前坐标 就是镜头新位置啦
transform.position =rotation * Vector3(-delta_x,0,-delta_y)+transform.position;
}
//用滚轮控制镜头拉伸和推进
if(Input.GetAxis("Mouse ScrollWheel")){
var delta_z = -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
//直接用镜头的translate函数在镜头参考系Z方向上运动就可以啦
transform.Translate(0,0,-delta_z);
//再用delta_z修正镜头与视野中心点的距离 其实不记录也是可以的 每次都用sin算比较麻烦
distance += delta_z;
}
//按住鼠标右键移动鼠标旋转镜头
if (Input.GetMouseButton(1)) {
var delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed;
var delta_rotation_y = -Input.GetAxis("Mouse Y") * RotateSpeed;
//旋转是以镜头当前视野中心点为原点进行的 在一个平行于地面的水平面上旋转
//先算出当前视野中心的坐标,中心的概念就是正对 上下左右都对齐,离开一个distance距离
//所以中心点相对镜头参照系的坐标就是0,0,distance,乘以镜头的变换,在加上镜头的世界坐标 就是中心点的世界坐标了
position =transform.rotation* Vector3(0,0,distance)+transform.position;
//Y轴方向上用世界坐标的变换就可以拉 否则镜头会歪的
transform.Rotate(0,delta_rotation_x,0,Space.World);
//x轴方向的旋转是相对自身的 否则镜头也会歪
transform.Rotate(delta_rotation_y,0,0);
//转完以后 把这个新的旋转角度 乘以一个“正对中心”的相对坐标 再加上中心点的坐标 就是新的镜头世界坐标啦
transform.position =transform.rotation* Vector3(0,0,-distance)+position;
}
}
|
有变换,神马都是一样的原理。
再贴一个自己写的适合RPG用的镜头跟随脚本,C#的
复制代码
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
|
using UnityEngine;
using System.Collections;
public class MouseFollow_ForRPG_CSharp : MonoBehaviour {
public GameObject target;
public float ZoomSpeed = 30;//镜头缩放速率
public float MovingSpeed = 1;//镜头移动速率
public float RotateSpeed = 1; //镜头旋转速率
public float distance = 20;//设置距离角色的距离
public float ViewAngle = 30;//设置镜头斜视的角度
void Start () {
if(target){
transform.rotation = Quaternion.Euler(ViewAngle, target.transform.rotation.eulerAngles.y,0 );
transform.position = transform.rotation * new Vector3(0,0,-distance)+target.transform.position;
}
}
void Update () {
Quaternion rotation;
Vector3 position;
float delta_x,delta_y;
float delta_rotation_x,delta_rotation_y;
if(target){
if(Input.GetMouseButton(0))
{
delta_x = Input.GetAxis("Mouse X") * MovingSpeed;
delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;
rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y,0 );
transform.position = rotation * new Vector3(-delta_x,0,-delta_y)+ transform.position;
}
else{
if(Input.GetAxis("Mouse ScrollWheel")!= 0){
distance += -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
}
if (Input.GetMouseButton(1)) {
delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed;
delta_rotation_y = -Input.GetAxis("Mouse Y") * RotateSpeed;
transform.Rotate(0,delta_rotation_x,0,Space.World);
transform.Rotate(delta_rotation_y,0,0);
}
else {
transform.rotation = Quaternion.Slerp(transform.rotation,
Quaternion.Euler(transform.rotation.eulerAngles.x, target.transform.rotation.eulerAngles.y,0
),Time.deltaTime*2);
}
transform.position = transform.rotation* new Vector3(0,0,-distance)+ target.transform.position;
}
}
}
}
|
转载自 http://game.ceeger.com/forum/read.php?tid=2703&fid=2