《Unity3D编写雷电游戏》由会员分享,可在线阅读,更多相关《Unity3D编写雷电游戏(20页珍藏版)》请在金锄头文库上搜索。
1、基础实用的一篇经验教程!一、搭建游戏的框架。一般的游戏都可以分为四个场景:1.开始界面2.游戏场景3.暂停界面4.结束界面开始界面,就是存放开始菜单的地方了,游戏场景就是游戏的主场景,游戏的主要元素都在这边体现,暂停和结束画面我就不多说了。更多的还有在开始和主游戏场景之间加入过场动画等等。当然你也可以在暂停界面中插入广告我们会发现这几个场景之间其实就是切换来切换去的关系。如果知道设计模式中的State模式,就会发现跟这个很象。可以通过State模式来实现这几个场景的分离,然后分边为他们添加不同的元素。想要挂接在Unity3D中的结点的脚本都得继承MonoBehaviour,State就是所有的
2、状态的父类了,主要是三个函数,Init()用于这个状态的初始化,Update用于场景的更新,Exit()用于当离开当前状态时所进行的一些操作,比如隐藏当前界面等。创建一个空的Object用来挂接我们游戏的主脚本,代码如下:using UnityEngine;using System.Collections;推荐精选public class Main_Script : MonoBehaviour public State m_CurState;public void ChangeState(State newState)m_CurState.Exit();m_CurState = newStat
3、e;m_CurState.Init();/ Use this for initializationvoid Start () m_CurState.Init();/ Update is called once per framevoid Update () m_CurState.Update();这样我们就可以轻松的在不同的状态中切换了。想要增加一个新的状态,就只需继承State类,然后在其中写这个状态所要的元素,在适当的地方ChangeState一下就好了。脚本的层次结构如下:推荐精选例如我在按钮按下时切换到开始场景:using System.Collections;public class
4、 BeginGame : MonoBehaviour public StateRun m_RunState;public Main_Script m_MainScript;/ Use this for initializationvoid Start () / Update is called once per framevoid Update () void OnMouseEnter()print(enter);推荐精选void OnMouseUp()m_MainScript.ChangeState(m_RunState);void OnMouseExit()print(exit);这个脚本
5、是挂在一个板上面的,点击它时就进入游戏的主场景了。下回说一下飞机的移动。现在开始真正的游戏元素的编写了。第一步,让飞机动起来。首先是飞机的前进,通常2D中的做就是背景的循环滚动。在3D中我们可以让摄像机移动,背景我们可以做超一个大地形。在地形上摆一些固定的东西。/ Update is called once per framevoid Update () TurnLeft = false;TurnRight = false;if (Input.GetKey(KeyCode.W) Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(t
6、his.transform.position);/print(screenPos.y);推荐精选if (Screen.height screenPos.y)this.transform.Translate(Vector3.forward * Time.deltaTime * m_nMoveSpeed);if (Input.GetKey(KeyCode.S)Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);if (0 screenPos.y)this.transform.Transl
7、ate(Vector3.forward * Time.deltaTime * -m_nMoveSpeed);if (Input.GetKey(KeyCode.A)Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);if (0 screenPos.x)this.transform.Translate(Vector3.left * Time.deltaTime * m_nMoveSpeed);/向左转if (CurRotation screenPos.x)this.transform.T
8、ranslate(Vector3.left * Time.deltaTime * -m_nMoveSpeed);/向右转if (CurRotation -RotateLimit)CurRotation -= RotateSpeed;TurnRight = true;/回归if (!TurnLeft & !TurnRight)if (CurRotation 0.0)CurRotation -=RotateSpeed;else if (CurRotation m_CurWeapon.GetBulletInterval()推荐精选m_CurWeapon.Fire();m_FireElapseTime
9、 = 0;else记录子弹发射后的时间,然后在大于时间间隔后才能发射下一个子弹。武器父类:using UnityEngine;using System.Collections;using System;public class Weapon : MonoBehaviour /子弹时间间隔protected float m_fBulletInterval = 0;/子弹类型public String m_typeName =;public float GetBulletInterval()return m_fBulletInterval;推荐精选/ Use this for initializa
10、tionvoid Start () / Update is called once per framevoid Update () public virtual void Fire()最基本的一种子弹:using UnityEngine;using System.Collections;public class WeaponNormal : Weapon private const int MAX_FP = 2;public Transform m_FirePoint = new TransformMAX_FP;public Rigidbody m_BulletPre;WeaponNormal
11、()m_fBulletInterval = 2;m_typeName = Normal;推荐精选/ Use this for initializationvoid Start () / Update is called once per framevoid Update () public override void Fire()for(int i = 0; i MAX_FP; i+)Rigidbody clone = (Rigidbody)Instantiate(m_BulletPre, m_FirePointi.position,m_FirePointi.rotation);clone.velocity = transform.TransformDirection(Vector3.forwar