界面拖拽实现
将Main Camera 拖拽到 第一/三人称角色的目录下即可,如图:
注意相机应该是Main Camera,因为你可能误把相机删了,然后自己创建了一个相机。你可以点击它,查看 Inspector 的Tag 标签,查看其是否为 MainCamera 。如果不是将其重新选择为MainCamera 即可。
脚本实现
通过创建脚本cameraContorlan ,将其挂载到Main Camera上即可。具体代码将在最后给出(注释非常详细,这的感谢我的刘老师)
创建脚本
在下面的Assets目录下,右键create 选择C # Script即可。
可以创建一个目录来存储脚本文件,文件名应在创建的时候修改好
脚本挂载到物体上
点击 Main Camera 将脚本文件拖拽到其 Inspector 里即可。观察到其会多一个 Script 组件出来。同样,我们也可以通过直接在主相机的 Inspector中 Add Component来实现。
脚本代码
//导入UnitEngine和系统资源
using UnityEngine;
using System.Collections;
//创建一个公有的类,类名和文件名保持一致
/*如果脚本文件名更改了,这个类名也要同时更改*/
public class cameraControlan : MonoBehaviour {
//定义一个公有变量,表示人物角色
//物体的类型一般用Transform;变量定义之后需要到Unity窗口下把物体和变量绑定一下
public Transform Character;
//定义公有变量表示相机的垂直高度和水平距离
public float DisUp;
public float DisAway ;
//初始化相机实时速度
public Vector3 speed = Vector3.zero;
// Use this for initialization
//初始化函数,程序运行后执行一次s
void Start () {
//print ("初始化");
DisUp = 2f;
DisAway = 9f;
}
// Update is called once per frame
//这个函数会每一帧执行一次
void Update () {
//print ("更新了一帧");
/*在脚本中,transform表示脚本挂载的物体组件,因为当前脚本挂到了main camera上,
所以transform表示相机的transform组件,简单理解为表示相机。*/
//transform.postition 指相机的三维坐标
//让相机的位置移动到人的位置
//transform.position = Character.position;
//定义一个坐标,表示相机和角色之间的相对坐标
//Vector3 表示三维坐标系中的向量
//c#中,小数后一般加f,表示浮点型
Vector3 distance = new Vector3(0,DisUp,-DisAway);
//把相对坐标通过角色的坐标转换为世界坐标
Vector3 targetPosition = Character.TransformPoint(distance);
//把获取的目标位置坐标赋值给相机
transform.position = targetPosition;
//让相机平滑过渡到目标位置 方法参数:相机现在的位置,相机的目标位置,相机当前的速度,相机的过渡时间
//ref 关键字对应的参数必须提前初始化,特点是对应的参数值会时时变化。
transform.position = Vector3.SmoothDamp(transform.position,targetPosition,ref speed,0.5f);
//让相机正对角色
transform.LookAt(Character);
}
}
//脚本必须挂载到物体上才能执行
对于变量 character 需要在 Main Camera的Inspector 界面将其绑定才行。可以看见,在其Script 下多出了一个character,可以直接从scene(目录)窗口将角色拖拽到character后的框里。
也可以选择框后的小圆点来选择角色。
这种在脚本中创建公有变量,在界面中将其绑定以便在代码中获得代表它的变量的操作以后会经常遇到。