最近一段时间萌生了做游戏的想法,便一发不可收拾,忙活了好几天,终于跟着网上的教程做了一个太空射击的FPS游戏,想着应该好好总结一下,对于我这种刚接触游戏的小白来说,这个入门的项目还是可以学到很多东西的。
1.关于脚本的API的总结
(1)首先是用的很多的一个方法:MonoBehaviour.OnTriggerExit(),该方法的作用是:当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。(可以用这个判断一些游戏的边界,也就是说当物体离开边界的时候销毁该物体)
void OnTriggerExit(Collider other){
Destroy (other.gameObject);
}
//顺便要提一下,MonoBehaviour是所有脚本的基类,js脚本默认是继承这个类,但是C#与Boo是需要显式的继承这个类的
(2)另外一个类似的方法也比较常用,那就是MonoBehaviour.OnTriggerEnter().当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。
销毁所有进入触发器的物体
void OnTriggerEnter(Collider other) {
Destroy(other.gameObject);
}
以上两个方法有个共同点:这个消息被发送到触发器和接触到这个触发器的碰撞体。注意如果碰撞体附加了一个刚体,也只发送触发器事件。(这句话并不是很理解)
(3)Transform类:场景中的每一个物体都有一个Transform。用于储存并操控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。他们也支持计数器(enumerator),因此你可以使用循环遍历子物体。也就是说可以通过这个类的一些成员来控制关于物体在场景中的大小,位置等参数
(4)Transform附加到GameObject(游戏物体)(如无附加则为空)。就成了transform,也就是组件Component的一个变量,类似的变量还有rigidBody,camera等等,在5.0版本中必须要通过GetComponent<…>()来获取组件!
(5)RigidBody刚体组件:非常常用的一个组件,这个组件有很多有用的变量可以通过GetComponent().来使用,如rotation,positionvelocity,angulerVelocity(角速度)等等。
void Start () {
//给带刚体的GameObject一个速度值
GetComponent ().velocity = transform.forward * speed;
}
(6)Input类,这个类是输入系统的接口,在各个平台上这个类的作用是有一定差别的,具体要查阅API,有几个常用的方法
Input.getAxis(string name):根据坐标轴名称返回虚拟坐标系中的值。方向有Horizontal和Vertical,返回的值是-1到1之间;
Input.getButton(string name):根据按钮名称返回true当对应的虚拟按钮被按住时。
Input.getKey(string name):当通过名称指定的按键被用户按住时返回true。想想自动开火。
Input.getKeyDown(string name):在给定名称的虚拟按钮被按下的那一帧返回true。
Input.getKeyUp(string name):在用户释放给定名字的按键的那一帧返回true。
(7)Time.deltaTime:增量时间
放在Update()函数中的代码是以帧来执行的.如果我们需要物体的移动以秒来执行.我们需要将物体移动的值乘以Time.deltaTime。举个例子,如果我们想物体以每秒10米的速度进行移动,应该是10*Time.deltaTime,如果不乘以这个的话,那么物体是以每帧10米的速度进行移动的.
(8)Object.Instantiate():克隆原始物体,并且返回克隆的物体
clone = Instantiate(object, transform.position, transform.rotation);
(9)MonoBehaviour.InvokeRepeating():在time秒调用methodName方法;简单说,根据时间调用指定方法名的方法,从第一次调用开始,每隔repeatRate时间调用一次.也就是经过time时间过后,每隔repeatRate时间调用一次
function InvokeRepeating (string methodName, float time, float repeateRate)
(10)MomoBehaviour.StartCoroutine()开始协同程序,下面有一个官方的演示程序来进行理解
此例演示如何调用协同程序和它的执行
function Start() {
// - After 0 seconds, prints “Starting 0.0”
// - After 0 seconds, prints “Before WaitAndPrint Finishes 0.0”
// - After 2 seconds, prints “WaitAndPrint 2.0”
// 先打印”Starting 0.0”和”Before WaitAndPrint Finishes 0.0”两句,2秒后打印”WaitAndPrint 2.0”
print (“Starting ” + Time.time );
// Start function WaitAndPrint as a coroutine. And continue execution while it is running
// this is the same as WaintAndPrint(2.0) as the compiler does it for you automatically
// 协同程序WaitAndPrint在Start函数内执行,可以视同于它与Start函数同步执行.
StartCoroutine(WaitAndPrint(2.0));
print (“Before WaitAndPrint Finishes ” + Time.time );
}
function WaitAndPrint (waitTime : float) {
// suspend execution for waitTime seconds
// 暂停执行waitTime秒
yield WaitForSeconds (waitTime);
print (“WaitAndPrint “+ Time.time );
}
(11)Update()方法与FixedUpdate()方法的区别:
Update是在每次渲染新的一帧的时候才会调用,FixedUpdate,是在固定的时间间隔执行,不受游戏帧率(fps)的影响
FixedUpdate的时间间隔可以在项目设置中更改,Edit->Project Setting->time 找到Fixed timestep。就可以修改了!
2.关于整个游戏制作过程中的一些心得和体会
(1)刚开始进行游戏物体的添加的时候,一定要注意坐标,也一定要注意世界坐标和本地坐标的区别,不要将游戏物体胡乱拖拉拜访,哪个物体在坐标系中的哪个位置一定要心里有数
(2)写脚本的时候思路一定要清晰,不能想到什么组件就加什么组件,那样会造成混乱,导致出现问题找bug的时候很难
(3)最重要的一点是:一定不要怕麻烦,不要畏难,做游戏本身是一种枯燥的过程,特别是后台的逻辑,思路一定要清晰,而且要有钻研的精神,遇到不懂的多查查API,清楚其中的原理是很重要的。
如果觉得《Unity3D官方案例--太空射击游戏总结》对你有帮助,请点赞、收藏,并留下你的观点哦!