第3期

1,如何避免点击UI按钮时穿透,同时触发了相同位置场景模型的点击事件的情况?(NGUI 判断 是否点击到UI)
答:1,可以在最下层加个碰撞框作为屏蔽层,
      2,通过射线分层处理,显示层分为不同的Layer,用射线进行判断是否点击到UI层

      3 , 打开NGUI——Open——CameraTools,把里面的摄像机的勾都打上 ,然后视你需要遮盖的层来选择即可

      4 , 利用UIcamera.hoveredObject 或者UIcamera.isOverUI 可以获取当前鼠标是否停驻在UI界面上,然后我们在场景的点击事  件中只需要在事件判断加上判断鼠标时否停在UI界面的逻辑值即可。


2,切换场景时,如何让背景音乐持续播放,而不是重新播放?
答:这里我们假定第一次播放背景音乐的场景为startScence,我们在startScence创建一个新的gameObject,命名为BgmSound.并添        加AudioSource组件以及一个空脚本。
 在脚本中我们控制AudioSource的播放,为了切换场景音乐持续播放,我们可以在代码中的Awake中加上DontDestroyOnLoad(this.gameObject)。这样就能保证切换不间断。

   但是这样会出一个问题,当其他场景切换到此场景的时候场景会多出一个startScence.为了解决这个问题我们就只能把BgmSound动态加载.我们把BmgSound做成一个Prefab.并加上标签bgm.我们在代码中控制。(使用DontDestroyOnLoad()方法处理挂载一个背景音乐组件的GameObject)

    public GameObject bgmObj = null;
    void Start () {
          bgmObj =GameObject.FindGameObjectWithTag( "bgm" );
          if(bgmObj==null) {
         bgmObj= (GameObject)Instantiate(prefab);  //这里的prefab就是 BgmSound做成的预制体
  }  
}


3,如何实现游戏存档和读档的功能?
答:1,简单数据存档和读取使用Unity提供PlayerPrefs。
      2,复杂的存档和读取可以使用序列化和反序列化用XML或者Josn进行
      3,也可以使用数据库,不推荐sql
      4,直接按照自己的格式写成自己需要的文件也可以,使用不多。

       最常用1,2方案

       对于小型的数据存储可以采用前两种方式 :
       方法一: 利用插件如: easy save
       方法二: Unity给我们提供了数据持久化方案PlayerPrefs.里面有三个API.SetInt 、SetFloat 、SetString 我们能通过键值形式存储int、float、string 这三种基本数据类型。
    
       对于大型数据,我们更希望的是得到一个结构化的游戏存档.而非前者这样松散的单个数据.

       我们可以采用数据序列化的思路,在游戏中将需要保存的信息分类给出id,然后序列化成字符串输出到Json中.

       给出Api:   JsonConvert.SerializeObject(object );           将obj序列化成字符串                      

                       JsonConvert.DeserializeObject(string,type);          将字符串根据类型反序列转化为obj.

       从游戏数据存储的安全性出发,我们还可以对序列化生成的数据进行加密操作.


4,什么是协同程序?请举一个游戏中应用协程的例子。
答:Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器。
所谓协同,就是在主程序运行的时间同时开启另外一段逻辑处理,来协同当前程序的执行,当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
    开始2s后销毁对象
    IEnumerator Start()
      {
        yield return new WaitForSeconds(2.0f);
        Destroy(this.gameObject);
      }
     协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。
       在Unity中:我们可以把某个需要协同处理的函数的返回值改为 IEnumerator .然后使用 StartCoroutine 开启协程.参数可以为方法名字符串,也可以是方法加().区别就是,字符串做参数的时候协程函数只能最多有一个参数。而类似于StartCoroutine(Func(int a,int b))则可以使用多个参数。但是字符串做参数的好处是可以用 StopCoroutine 来定向 停止某个协程。在协程函数中我们可以使用WaitForSeconds(float) 来延迟 float 秒.达到延时效果.       在Unity 协同程序主要是用来延时,其应用有很多地方,比如: 子弹、特效、敌人死亡等的延迟销毁、怪物的定时刷新效果、技能持续时间效果
       一个简单的协程: 
[C#]  纯文本查看  复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class test : MonoBehaviour {
    IEnumerator Start()
    {
        yield return new WaitForSeconds(2.0f);
        Destroy(this.gameObject);
    }
}      这段代码可以看出,不仅仅我们定义的函数可以设置为 IEnumerator 还可以把Start、Awake 这类函数设为协程函数.
        [以下观点仅为个人理解]
        其实在没有接触过Coroutine的时候,我们也有自己的方法实现延时效果,就是 加定时器, 然后在Update里面去持续更新。那么这两者有区别么?我觉得是相似的。网上有的博客上解释道:

        Coroutine 其实就是开了一个线程来处理一段代码。但是,我在许多大神的博客和评论中了解到其实Coroutine和线程并没有关系,其实现和我们自己写计时器并无太大区别。


5,什么是游戏框架?使用框架的好处是什么?
答:1,游戏框架是在引擎的基础上再进行一次功能封装,把常用功能进行封装,针对项目进行一次具体的开发模式封装,比如UI使用MVC,战斗使用FSM,HFSM,BT。。。。
     2,使用游戏框架开发能节约工程时间,易维护,易扩展,易阅读开发,可复用。 
 选择框架和使用框架是控制框架的基础。

     我觉得如果把做游戏比喻成画一幅画来说,框架就是把画里面元素的线描好了。至于怎么去组合、怎么涂色就看你的你自己的想法。
      在我的理解中,游戏主框架就是整个游戏各个模块的架构。游戏主框架规定了有哪些模块以及这些模块给出的接口,以及管理游戏的各个模块。
      使用框架后,游戏分为各个模块,被对于开发者就可以集中精力去实现各个模块内部的逻辑实现。同样的, 在架构下,保证了每个模块的封装,也实现了模块的重用性。


6,如何在Unity中播放视频?
答:1,首先下载安装Quicktime ,U3D承认的视格式为.mov, .mpg, .mpeg, .mp4, .avi, .asf格式。

      2,创建一个对象,使用对象拖拽的形式为Mov Texture对象赋值,之后就可以在脚本中使用它了。


      提要:在Unity 中 视频支持.mov、.mpg、.mpeg、.mp4、.avi和.asf.而Unity对于视频都是以MovieTexture来使用的。如果视频中有声音那么在视频文件下面会相应生成audio文件。所以一个完 整的 视频播放是应该画面和音频的同步播放。
    方法一:基于GameObject上,这种方式可以让影片以任何方式播放,比如你要实现一个教室,教室讲台上有个投影幕,电影应当在投影幕上播放。这样影片播放就是实打实的在荧幕这个游戏 GameObject上面播放。
                  实现方法:首先你要在播放的地方加个plane。上面挂一个 Play 脚本。  
[C#]  纯文本查看  复制代码
using UnityEngine;
using System.Collections;
public class Play : MonoBehaviour
{   public MovieTexture movTexture;      //电影纹理
     public AudioSource audioSource;
void Start()  
     {  renderer.material.mainTexture = movTexture;      //设置当前对象的主纹理为电影纹理
         movTexture.loop = true;                                   //设置电影纹理播放模式为循环
         audioSource = GetComponent<AudioSource>();        //如果有声音才播放声音
     }    public void OnPlay()       
{        movTexture.Play();                                   //   audioSource.Play();       
 }    public void OnPause()      
{        movTexture.Pause();                                    //  audioSource.Pause();      
}     public void OnStop()      
{        movTexture.Stop();                               // audioSource.Stop();     
}}
           我们将视频生成的 MovieTexture 拖放复制到movTexture 中,如果有声音,应当给plane添加AudioSource组件并把把生成的音频文件拖放到AudioClip处。脚本中给出了三个函数分别对应的是 视频的播放、暂停、停止。

  方法二:基于Unity 的OnGUI实现,这样视频就是以UI元素存在于游戏中。
                    实现方法:这种方法不需要载体。直接可以将脚本挂在Mamera上。
        
[C#]  纯文本查看  复制代码
using UnityEngine;
using System.Collections;
public class Play : MonoBehaviour
{                                      //电影纹理
    public MovieTexture movTexture;
    public AudioSource audioSource;
    void Start()
    {                               //设置电影纹理播放模式为循环
         movTexture.loop = true;
                                                    //如果有声音才播放声音
        audioSource = GetComponent<AudioSource>();
    }
  void OnGUI()  //绘制电影纹理
    {  
        GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), movTexture, ScaleMode.StretchToFill);
    }
    public void OnPlay()
    {
        movTexture.Play();            // audioSource.Play();
    }
    public void OnPause()
    {
        movTexture.Pause();           // audioSource.Pause();
    }
    public void OnStop()
    {
        movTexture.Stop();            // audioSource.Stop();
    }

}

       我们将视频生成的MovieTexture拖放复制到movTexture中,如果有声音,应当给plane添加AudioSource组件并把把生成的音频文件拖放到AudioClip处。脚本中给出了三个函数分别对应的是视频的播放、暂停、停止。


7,跑酷游戏的无尽关卡是如何生成的?
答: 这个可以使用简单的场景流式加载,把地图分成一小段一小段的根据一定规则,加载新的释放久的。

8,如何增强ARPG游戏的打击感?
答: 1,从美术资源上看,不管是2D还是3D角色的动作流畅度跟动画的合理性都能提高游戏的打击感。
    2,游戏中角色的技能或者特定动作加上拖尾效果,多一些技能特效,画面扭曲效果。被打击方的状态控制。
    3,相机,也就是主视角可以增加震动效果,镜头的一些特效,各种动态效果的使用。
    4,音效效果在战斗的时候体现十分明显。

9,游戏慢镜头回放功能的实现思路?如足球游戏中的精彩镜头回放。
答: 
    1,卡牌游戏里面的战斗可以使用的方案之一是战报,其实就是把所有技能移动全部播放一遍,回放其实再播放一遍就可以了。
    只有战斗能够进行序列化,重新把命令播放一遍就可以了
    2,状态记录同步,记录每一帧所有角色状态,包括位置,旋转等,这种方法短时间回放没什么大问题。

    3,直接录屏将整个动画保存成视频,回放时播放视频就可以。


         我觉得要增加拟真度可以通过特效、声音、动画等几个方面。
      1.特效。不仅仅是游戏中的技能特效。例如武士2中的出血特效、连击特效等等。好的特效不仅仅会给玩家视觉上的享受,还可以让玩家更容易融入游戏场景中。
      2.声音。在合适的时机播放正确的音乐可能玩家不会感觉到什么,但是如果在合适的时机没有播放或者播放的不适当的音乐,玩家就会产生强烈的违和感。就假如说对打过程中,如果你的拳头都已经碰到敌人的身体。可以打击音效还没有播放。然而当敌人都飞出去了。音效才播放出来。无疑玩家会感觉十分的不舒服。所以说,选好音效、控制好播放时机对增加游戏的打击感是必不可少的。
      3.动画。这里的动画不是简简单单的动画,更应该说是结合游戏过程中物理作用下的模型的反馈。比如说。玩家横向一拳打向敌人,敌人不应该是飞起来。好的动画是应该结合实时的物理条件下的 动作反馈。给人以真实的效果呈现。

      4.还有一些元素可以增加打击感,例如手柄上的震动或者必杀技的慢放等等。


10,LOD技术是什么?优缺点是?
答:1,LOD是Levels of Detail的简称,译为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置
            和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
      2,LOD的优点可以根据距离动态地选折渲染不同细节的模型

      3,LOD缺点增加项目的包的大小,并且内存会增大,属于内存换效果。


LOD( Level of detail )技术是作为Unity优化的一大常用技术。
        我们都知道一个模型越是精细,顶点就会越多。渲染的时候就会耗时。所以我们在游戏优化的时候我们除了尽量减少DrawCall也会尽量使得在不影响游戏画面的情况下减少模型的顶点。
        生活着我们都会遇到过这样的例子: "诶,你看这东西像吗?" “一般般吧,不过拿远了看还真分辨不出来。”。对,当一个物体离我们眼睛过远的时候我们是用过肉眼很难分辨其精细程度的。那么在游戏中我们知道一个物体不在Camera镜头之内或者说是离Camera很远的时候,无论它是否精细,我们通过肉眼是很难观察到的。这样的话,其实就算模型不是那么精细。也不太会影响游戏画面。所以.LOD技术就是在根据摄像机距离对象的远近,选择使用不同精度的模型。它的好处是可以在适当的时候大量减少需要绘制的顶点数目。这样就达到了优化的作用。
        优点就是:合理的使用LOD可以大大减少游戏渲染时间。在保证游戏画面依然精细的条件下让支持游戏的最低配置要求大大减少。
        缺点是:当然游戏需要占用更多内存。而且如果在LOD算法没有把握好距离的时候,会让玩家看到模型顶点切换的突变。反而效果不好。


      在Unity中也可以使用LOD技术,Unity提供了LODgroup这个组件。开发者可以将不同的层次细节的物体模型分别添加到LOD:0~LOD:7中。其中,LOD:0是视点距离最近具体观看下进行显示的模型。一般添加层次细节最丰富的模型,后面依次添加与原始模型外观相同但层次细节逐次降低的模型,最后的“Culled”表示该模型在场景中消失.一般这是指物体非常远或者不在Camera视野内情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值