unity 常用的几种相机跟随

固定相机跟随

这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class CameraFlow : MonoBehaviour
 5 {
 6     public Transform target;
 7     private Vector3 offset;
 8     // Use this for initialization
 9     void Start()
10     {
11         offset = target.position - this.transform.position;
12
13     }
14
15     // Update is called once per frame
16     void Update()
17     {
18         this.transform.position = target.position - offset;
19     }
20 }

固定相机跟随,带有角度旋转

这一种相机跟随是对第一种相机跟随的改进,在原有基础上面,添加了跟随角度的控制

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class CameriaTrack : MonoBehaviour {
 5     private Vector3 offset = new Vector3(0,5,4);//相机相对于玩家的位置
 6     private Transform target;
 7     private Vector3 pos;
 8
 9     public float speed = 2;
10
11     // Use this for initialization
12     void Start () {
13         target = GameObject.FindGameObjectWithTag("Player").transform;
14
15     }
16
17     // Update is called once per frame
18     void Update () {
19         pos = target.position + offset;
20         this.transform.position = Vector3.Lerp(this.transform.position, pos, speed*Time.deltaTime);//调整相机与玩家之间的距离
21         Quaternion angel = Quaternion.LookRotation(target.position - this.transform.position);//获取旋转角度
22         this.transform.rotation = Quaternion.Slerp(this.transform.rotation, angel, speed * Time.deltaTime);
23
24     }
25 }

第三人称相机

这种相机跟随,是第三人称角度看向对象的,也就是一直看向对象的后面,如一直显示玩家的后背

 1 using UnityEngine;
 2 using System.Collections;
 3 //相机一直拍摄主角的后背
 4 public class CameraFlow : MonoBehaviour {
 5
 6     public Transform target;
 7
 8
 9     public float distanceUp=15f;
10     public float distanceAway = 10f;
11     public float smooth = 2f;//位置平滑移动值
12     public float camDepthSmooth = 5f;
13     // Use this for initialization
14     void Start () {
15
16     }
17
18     // Update is called once per frame
19     void Update () {
20        // 鼠标轴控制相机的远近
21         if ((Input.mouseScrollDelta.y < 0 && Camera.main.fieldOfView >= 3) || Input.mouseScrollDelta.y > 0 && Camera.main.fieldOfView <= 80)
22         {
23             Camera.main.fieldOfView += Input.mouseScrollDelta.y * camDepthSmooth * Time.deltaTime;
24         }
25
26     }
27
28     void LateUpdate()
29     {
30        //相机的位置
31         Vector3 disPos = target.position + Vector3.up * distanceUp - target.forward * distanceAway;
32         transform.position=Vector3.Lerp(transform.position,disPos,Time.deltaTime*smooth);
33         //相机的角度
34         transform.LookAt(target.position);
35     }
36
37
38 }

相机跟随,鼠标控制移动和缩放

相机与观察对象保持一定距离,可以通过鼠标进行上下左右旋转,通过鼠标滚轮进行放大和缩小操作

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class CameraFlow : MonoBehaviour
 5 {
 6     public Transform target;
 7     Vector3 offset;
 8     // Use this for initialization
 9     void Start()
10     {
11         offset = transform.position - target.position;
12     }
13
14     // Update is called once per frame
15     void Update()
16     {
17         transform.position = target.position + offset;
18         Rotate();
19         Scale();
20     }
21     //缩放
22     private void Scale()
23     {
24         float dis = offset.magnitude;
25         dis += Input.GetAxis("Mouse ScrollWheel") * 5;
26         Debug.Log("dis=" + dis);
27         if (dis < 10 || dis > 40)
28         {
29             return;
30         }
31         offset = offset.normalized * dis;
32     }
33     //左右上下移动
34     private void Rotate()
35     {
36         if (Input.GetMouseButton(1))
37         {
38             Vector3 pos = transform.position;
39             Vector3 rot = transform.eulerAngles;
40
41             //围绕原点旋转,也可以将Vector3.zero改为 target.position,就是围绕观察对象旋转
42             transform.RotateAround(Vector3.zero, Vector3.up, Input.GetAxis("Mouse X") * 10);
43             transform.RotateAround(Vector3.zero, Vector3.left, Input.GetAxis("Mouse Y") * 10);
44             float x = transform.eulerAngles.x;
45             float y = transform.eulerAngles.y;
46             Debug.Log("x=" + x);
47             Debug.Log("y=" + y);
48             //控制移动范围
49             if (x < 20 || x > 45 || y < 0 || y > 40)
50             {
51                 transform.position = pos;
52                 transform.eulerAngles = rot;
53             }
54             //  更新相对差值
55             offset = transform.position - target.position;
56         }
57
58     }
59 }

转载:http://blog.csdn.net/u011484013/article/details/51554745

时间: 2024-10-26 08:13:39

unity 常用的几种相机跟随的相关文章

【Unity笔记】第三人称相机跟随

第三人称,摄像机跟在角色后上方. void Update () { myCamera.position = transform.position + new Vector3(0, 1.5f, 5); myCamera.LookAt(transform); //if(Input.anyKeyDown) { // for (int i = 0; i < keys.Length; i++) { // if (Input.GetKeyDown(keys[i])) { // animator.SetFlo

Unity游戏开发第三人称摄像机跟随

在第三人称游戏开发中,因为我们的人物是会不断移动的,所以我们的相机需要保持合适的角度跟随我们的人物进行移动,最简单的一种实现方法是先在unity场景中将摄像机调整到合适的位置,然后将它放到我们的人物下面,让他成为人物的子物体,这样做也可以达到摄像机跟随的目的.如果对摄像机跟随的要求不高的话可以临时采用这种方法 为了实现第三人称摄像机跟随的功能,大部分情况先我们都是采用编写代码的方法来实现的.下面是本人实现的一种摄像机跟随的方法,仅供参考,实现的功能是按住键盘AD键可以让摄像机视野围绕人物左右移动

Unity3D 利用FSM设计相机跟随实现

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 FSM有限状态机前面已经跟读者介绍过,使用Unity3D引擎实现了动作状态以及技能切换,FSM使用的条件是有限个状态切换,我们可以将FSM应用到相机中,很多人会问在相机中如何使用FS

unity3d简单的相机跟随及视野旋转缩放

1.实现相机跟随主角运动 一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单的相机跟随了. 这里我们选取第二种方法,首先给Camera添加一个脚本,取名为FollowPlayer,脚本很简单不做说明了 1 public class FollowPlayer : MonoBehaviour { 2 3 private Transform player; 4 private V

unity3D:游戏分解之角色移动和相机跟随

游戏中,我们经常会有这样的操作,点击场景中某个位置,角色自动移动到那个位置,同时角色一直是朝向那个位置移动的,而且相机也会一直跟着角色移动.有些游戏,鼠标滑动屏幕,相机就会围绕角色旋转. 看似很简单的操作,那么到底是怎么实现的呢? 我们把上述操作分解为以下几个步骤 角色的移动 1. 移动到下一个路点,线性插值.曲线插值 2. 角色朝向,一直面朝下一个路点 相机跟随角色 1. 相机俯视角度,决定相机的高度 2. 相机跟随距离,前向距离或者直线距离(就是三角形的水平边长或者斜边长) 3. 相机一直看

最常用的6种原型文件格式对比

做互联网产品经理的小伙伴一定不会对"原型"这个词感到陌生.它就像"用户体验"一样经常被各类人挂在嘴边.原型是一种让用户提前体验产品.交流设计构想.展示复杂系统的方式.就本质而言,原型是一种沟通工具.在这里为大家介绍最常用的6种原型图文件格式以及各自的优缺点. 做互联网产品的小伙伴一定不会对"原型"这个词感到陌生.它就像"用户体验"一样经常被各类人挂在嘴边.原型是一种让用户提前体验产品.交流设计构想.展示复杂系统的方式.就本质而

iOS开发中常用的几种设计模式

下面是iOS开发中比较常用的几种设计模式.详情如下所示: (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content