学习Space shooter 小项目 总结

原创 2015年11月17日 16:39:09
1.提前设置发布环境(Switch platform),并在发布环境中的PlayerSettings.Resolution设置默认屏幕宽度;

2.场景中游戏对象的位开始全部在(0,0,0),Translate属性中Reset,方便场景布置;

3.相机视角可以选择Orthographic(正交视角),并通过Size调整相机的焦距,镜头远近,应用于二维视角场景中,二维场景的背景可以通过创建一个Quad,并添加相应的的背景贴图;默认为Perspective(透视视角),应用于三维视角场景中,相机背景除了可以使用天空盒,也可以使用单色模式,默认为蓝色;

4.所有的场景中都会包含一个“Ambient Light”默认颜色为ARGB(51,51,51,255),在Edit.RenderSettting中设置,可以设置为黑色,避免影响其他的灯光;

5.在复杂模型中需要使用Mesh Collider时可以在游戏对象的Mesh Colider的Mesh中选择线条简单的模型;

6.需要照亮场景时,可以选择3个平行光,2个倾斜相反角度,1个从对象底部方向照射,使其轮廓更加清晰,并注意将灯光进行归类,便于管理,Ctrl+Shift+N 创建新的游戏对象,并Translate.lReset重置到原点位置;

7.在游戏对象身上绑定脚本组件时,若需要在检视面板中调节的public类型变量太多,可以通过在该脚本中新增一个public类,并将统一的public 类型变量归类至该类中,在调用时实例化,同时将该类进行序列化,即在定义该类之前添加[System.Serializable] 进行实例化,这样在检视面板中public变量更方便管理;

8.在通过物理方式使游戏对象发生移动时,使用FixedUpdate函数,在每一个固定的物理步骤前自动调用,与帧数无关,一般默认时间间隔为0.02s,可以通过ProjectSetting.Time更改。
        floatspeed;
        floatmoveHorizontal = Input.GetAxis ("Horizontal");
        floatmoveVertical = Input.GetAxis ("Vertical");
 
        Vector3 movement = newVector3 (moveHorizontal, 0.0f, moveVertical);
        rigidbody.velocity = movement * speed;
 
在添加了刚体组件的游戏对象,可以通过ragidbody.velocity控制对象的简单移动;

       rigidbody.position = newVector3
        (
            Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax),
            0.0f,
            Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
        );
同时可以使用Mathf.Clamp(a,b,c)来控制a的值在b,c之间,使得游戏对象的位置得到控制,不会跑出边界;

9.采用如下代码来实例化对象,实例化对象需要传入实例化的对象,以及实例化后的对象translate和rotation信息,若不用跟踪实例化后的对象可以不用指定实例化后的对象类型,
fireRate和nextFire控制产生实例对象的数率;
  publicfloatfireRate;
  privatefloatnextFire;
  voidUpdate ()
    {
        if(Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
        }
    }

10.建立CUBE并删除其meshRender组件,将其作为边界触发器使用,并添加如下代码:
    void OnTriggerExit(Collider other)
    {
        Destroy(other.gameObject);
    }
 使超出边界的游戏对象销毁;

11.在给游戏对象添加脚本组件时,创建空物体作为父级对象,并在父对象上编写逻辑,子对象上用于添加纹理效果,尤其是作为prefabs需要反复调用时;

12.Random类可以用于产生随机数,其中Random.insideUnitSphere,返回一个Vector 3类型的随机数,其(x,y,z)三个数都会产生0-1的随机数,这样通过
rigidbody.angularVelocity = Random.insideUnitSphere * 5;
来产生组件随机旋转的效果了;

13. 可以通过Tag来控制是否产生碰撞事件,对于需要忽略的碰撞,可以使用return来跳出检测;
    public GameObject explosion;
    public GameObject playerExplosion;
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Boundary")
        {
            return;
        }
        Instantiate(explosion,transform.position,transform.rotation);
        if (other.tag == "Player")
        {
            Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
        }
        Destroy(other.gameObject);
        Destroy(gameObject);
    }

14.一波一波实例的实现
    void Start()
    {
        StartCoroutine(SpawnWaves());
    }
    IEnumerator SpawnWaves()
    {
        yield return new WaitForSeconds(startWait);
        while(true)
        {
              for (int i=0; i<hazardCount;i++ )
             {
              Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
              Quaternion spawnRotation = Quaternion.identity;
              Instantiate(hazard, spawnPosition, spawnRotation);
              yield return new WaitForSeconds(spawnWait);
             }
              yield return new WaitForSeconds(waveWait);
        }
    }
使用协同程序可以实现暂停一段时间执行代码,但不暂停场景的运行,在一段代码执行完后,添加
 yield return new WaitForSeconds(spawnWait);
括号内参数为需要暂停的时间,协同程序的调用与一般的函数调用不同,需要如下关键字:
StartCoroutine(SpawnWaves());

15.Destroy函数
Destroy(gameObject, lifetime);
第二个参数为摧毁前等待时间
16.若要在一个游戏对象的脚本中调用另一个游戏对象的脚本中的方法,先要定义该脚本类型,其次要找到该脚本所依赖的游戏对象,并完成所定义脚本的实例化,之后才可调用该脚本中的public方法
  private GameController gameController;      
GameObject gameControllerObject = GameObject.FindWithTag ("GameController");
        if (gameControllerObject != null)
        {
            gameController = gameControllerObject.GetComponent <GameController>();
        }
        if (gameController == null)
        {
            Debug.Log ("Cannot find 'GameController' script");
        }
private GameController gameController;
17.若要重新加载场景,可以使用如下代码,不必输入场景或序号
 Application.LoadLevel (Application.loadedLevel);
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

XNA Space Shooter Game源码和项目教程

  • 2008年12月24日 22:41
  • 1.29MB
  • 下载

Space Shooter项目中遇到的问题

原文地址:https://support.unity3d.com/hc/en-us/articles/206804326-Problems-with-Project-Space-Shooter症状当试...
  • hoxily
  • hoxily
  • 2017年02月20日 11:30
  • 165

Part2:Unity学习笔记十一 - Space Shooter

源代码和视频链接放在学习笔记十中 按照16课视频的内容做了一遍,没发现Unity4.x和Unity5.x在这个游戏中的太多不同 1.Rigidbody和Audio不能直接调用了,都要改成GetCo...

unity官方教程Space Shooter 学习笔记

我觉得这个教程对我最大的启发就是其中的一句话, 子物体是贴图,父物体是属性。所以我们在创建物体前最好先建立一个空的gameobject, 这样既可以保持hierarchy面板整洁便于管理,又能实现刚...

unity官方教程space shooter 学习文档

如题,在学习unity的过程中,发现可恶的只能在线看视频,网速严重受限的我感觉很是烦恼,快进一下,诶,不动了,过了一会儿。。。黑屏,就能看到刷新的字样 千辛万苦找到可以下载的视频,打开一看,字幕是英...

Unity 3D 官方教程——Space Shooter学习记录

space shooter 学习记录

Part2:Unity学习笔记十二 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)

我按照视频做的源码地址http://pan.baidu.com/s/1o8lGo7C,打开Main(Scene)是按视频做的,另外Done文件夹下有个Done_Main.unity是本身带的超过视频内...

Unity学习笔记(二)----Space Shooter

今天做完了创建子弹和障碍物的部分。 1.关于实例化    通过添加材质和更改shader创建了子弹的激光效果,之后添加脚本,在Start()函数里设定子弹的速度(为啥不能在FixedUpdate里...

Unity学习笔记(三)----Space Shooter

停了好几天没写,颓废,总结一下前几天的学习。 1.Audio和Text部分            Audio部分只有射击时的音效添加在PlayerController脚本里,在按下...

unity学习笔记(三),Space Shooter

unity学习笔记(三),Space Shooter问题一:一上来就发现个问题,官方视频中unity版本和我使用的不相同,视频要求web play为环境,可是没有,网上查了,发现web play弃用了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习Space shooter 小项目 总结
举报原因:
原因补充:

(最多只允许输入30个字)