(1)移动脚本代码
之前我们运行起来的程序只能从一个固定的角度观看,不能操控视角变换,这一部分我们写一个脚本来控制主摄像机的移动。
Unity3D常用的脚本是javascript和C#(C shape)。二者差别并不是很大,很多函数都是一样的
javascript脚本的默认内容是下面几行代码:
#pragma strict
function Start () {
}
function Update () {
}
Start()函数是在场景一开始运行时开始执行,写在里面的命令只执行一次。
Update()函数是每调用一帧执行一次,可以理解为可重复调用,实时调用的函数,即当程序运行时,此函数就会不断调用来改变游戏中的状态,直至游戏结束。
C#脚本比javascript脚本就要复杂一些了
using UnityEngine;
using System.Collections;
public class ScreptName : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
首先应该写出此脚本使用了什么“包”,using关键词后面跟包名,学过一些编程语言的同学会更了解,在C++及java语言的编程中,前面都要引用一些包。简单来说,包里包含了已经写好各类API接口和函数,方便开发人员的使用。
然后是public class 脚本名:MonoBehaviour(){}
这是一个类,所有的代码要写在这里面,而class后跟的名字是类名,类名要和脚本名一致
类里也有两个初始函数,和javascript的作用一样的,这里就不过多介绍了
小源主要根据C#脚本来讲解。
下面是实现场景漫游所需写的脚本内容。
manyou.cs
using UnityEngine;
using System.Collections;
public class ScreptName : MonoBehaviour {
public int speed1 = 25; //水平面运动的速度
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//此处有两种方法
//方法一
float x=Input.GetAxis("Horizontal")*Time.deltaTime*speed1;
float z = Input.GetAxis ("Vertical") * Time.deltaTime * speed1;
transform.Translate (x, 0, z); //三个参数分别代表x,y,z轴方向的变化
//方法二
if (Input.GetKey (KeyCode.A)) { //if判断,当满足按下键A时,进行括号内的操作
transform.Translate(0, 0, -speed1 * Time.deltaTime);
}
if (Input.GetKey (KeyCode.W)) {
transform.Translate(-speed1 * Time.deltaTime, 0, 0);
}
if (Input.GetKey (KeyCode.D)) {
transform.Translate(0, 0, speed1 * Time.deltaTime);
}
if (Input.GetKey (KeyCode.S)) {
transform.Translate(speed1 * Time.deltaTime, 0, 0);
}
}
}
上面两种方法,选其一即可,相信大家能轻松猜测到各种函数的用途
值得一提的是,Horizontal和Vertical是Unity3D中Edit->Project settings->Input中规定的操作,可以在这个路径打开Input看一下。
注意一点KeyCode.A只接受大写字母,如果写成KeyCode.a是会报错的。
(2)镜头旋转及升高降低
第一部分的代码只是使摄像机前后左右移动,下面我们要用代码实现镜头的旋转和升高降低。
manyou.cs
using UnityEngine;
using System.Collections;
public class ScreptName : MonoBehaviour {
public int speed1 = 25; //水平面运动的速度
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//此处有两种方法
//方法一
float x=Input.GetAxis("Horizontal")*Time.deltaTime*speed1;
float z = Input.GetAxis ("Vertical") * Time.deltaTime * speed1;
transform.Translate (x, 0, z); //三个参数分别代表x,y,z轴方向的变化
//方法二
if (Input.GetKey (KeyCode.A)) { //if判断,当满足按下键A时,进行括号内的操作
transform.Translate(0, 0, -speed1 * Time.deltaTime);
}
if (Input.GetKey (KeyCode.W)) {
transform.Translate(-speed1 * Time.deltaTime, 0, 0);
}
if (Input.GetKey (KeyCode.D)) {
transform.Translate(0, 0, speed1 * Time.deltaTime);
}
if (Input.GetKey (KeyCode.S)) {
transform.Translate(speed1 * Time.deltaTime, 0, 0);
}
//旋转
if (Input.GetKey (KeyCode.Q)) {
transform.Rotate (0, -speed2 * Time.deltaTime, 0, Space.Self);
}
if (Input.GetKey (KeyCode.E)) {
transform.Rotate(0, speed2 * Time.deltaTime, 0, Space.Self);
}
if (Input.GetKey (KeyCode.Z)) {
transform.Rotate(-speed2 * Time.deltaTime, 0, 0, Space.Self);
}
if (Input.GetKey (KeyCode.C)) {
transform.Rotate(speed2 * Time.deltaTime, 0, 0, Space.Self);
}
//升高降低镜头
if (Input.GetKey (KeyCode.H)) {
transform.Translate (0, speed3 * Time.deltaTime, 0);
}
if (Input.GetKey (KeyCode.N)) {
transform.Translate (0, -speed3 * Time.deltaTime, 0);
}
}
}
左右旋转使用了Q,E字母,上下旋转使用了Z,C字母,升高降低使用了H,N字母。
到这里为止,视角的基本操作就结束了。