设定一个物体使得camera可以从现在为止自动飞到当前位置
1. 设定一个位置,可以在其前方放置一个显示其位置的cube。这里也可以写脚本设定位置。
2. 使用函数
移动函数 transform.position = vector3.slerp(positionstart, positionEnd, Time*time*0.001);
旋转函数 transform.Rotation = Quaternion.slerp(StartRotation, aimRotation, Time.time*0.00001);
3.在控制自动漫游于原始FPC摄像机的切换脚本中添加功能:按下run,自动记录当前position,rotation;按FPS,恢复原来位置;
4. aimRotation制定:
4.1 由于我的摄像机一开始旋转了180度,因此需要添加
aimRotation = Inverse(CubeRotation);
aimRotation.y = 180度 + aimRotation.y;
4.2 当移动到aimpostion时,FPS在轻微移动,因此加上判断;FPS与aimPostion 很近的时候,就直接将位置赋值给FPS;
Time
Time.time 这一帧执行的时间距离开始时间
Time.deltatime * 10 每帧移动10米
这段脚本是我写的包含控制函数使得摄像机首先扭转方向到目标物体,然后按照该方向飞向目标物体,包含当物体里目标位置很近的时候,模糊摄像机,然后恢复正常状态
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
|
var startObject : GameObject; var aimObject : GameObject; var aimObjectLocation : GameObject; var maincamera : Camera; private var PositionStart : Vector3; private var PositionEnd : Vector3; private var aimRotation : Quaternion; private var startRotation : Quaternion; private var distance : float = 10; private var angle : float = 10; private var isBlur : boolean = false ; private var isCloseEnough : boolean = false ; private var relativePos : Vector3; private var rotationFinished : boolean = false ; private var angleDefinition : boolean = false ; private var translateBegin : boolean = false ; function Update () { PositionStart = startObject.transform.position; PositionEnd = aimObjectLocation.transform.position; if (!translateBegin) { relativePos = aimObject.transform.position - PositionStart; if (transform.position == PositionEnd) { rotationFinished = true ; } else { if (relativePos != Vector3.zero) { aimRotation = Quaternion.LookRotation(relativePos); } else { rotationFinished = true ; } var angle = Quaternion.Angle(transform.rotation, aimRotation); if (angle != 0) { rotationFinished = false ; //distance = 10; } else { rotationFinished = true ; } } } if (!rotationFinished) { if (angle > 0.1) { print( "rotationlast" ); transform.rotation = Quaternion.Slerp(startObject.transform.rotation, aimRotation, 0.15); //normal velocity } else { print( "rotationTheSame" ); rotationFinished = true ; transform.rotation = aimRotation; translateBegin = true ; } } if (translateBegin) { distance = Vector3.Distance(transform.position, PositionEnd); print(distance); if (distance < 0.1) { print( "distance< 0.1" ); transform.position = PositionEnd; translateBegin = false ; WaitToBlur(); //maincamera.orthographic = true; transform.rotation = aimObjectLocation.transform.rotation; } else { transform.LookAt(aimObject.transform); transform.position = Vector3.Slerp(PositionStart,PositionEnd, 0.08); } } } function WaitToBlur() { // suspend execution for waitTime seconds var blurCamera= maincamera.GetComponent( "BlurEffect" ); blurCamera.enabled = true ; yield WaitForSeconds (0.5); blurCamera.enabled = false ; } |