1、什么是单例?举一个游戏中使用单例的例子
单例模式是一种设计模式,即保证系统中只有一个类的实例,且该实例易于外界访问,从而方便对对象的访问,可以控制资源使用,个人理解类似于大家在一块黑板上讨论东西,不关心参与讨论的对象,单例就相当于黑板。
游戏中我一般在一个场景中设置一个GameController类为单例模式,其中提供若干辅助操作对象的方法,如控制参数设置,提供计算方法等,也会设置一个单例的声音管理器专门管理声音的统一播放。Unity中我这样设置单例。
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance //此段有时省略
{
get { return _instance; }
}
void Awake()
{
_instance = this; //使自身可被调用
}
}
常规写法:
public class Singleton
{
static Singleton instance;
public static Singleton Instance {
get {
if (instance == null) {
instance = new Singleton ();
}
return instance;
}
}
}
2、Unity实现昼夜交替的方法和思路
1)设置两个天空盒和摄像机,一个专门负责白天一个为夜晚,设置不同的天空盒,白昼的摄像机内设置一个光源,通过控制两个物体的显示 和隐藏实现。
2)最简单的方法插件实现Time of Day - Dynamic Sky Dome
3、塔防游戏中,地图的路径信息如何存储?让怪物沿着路径走的方法是什么?
1)一张图一个ID,然后把路径点信息保存到xml文件里,根据id去xml取路径点信息,就ok了。
至于让怪沿着路径点走的方法,就是坐标点减坐标点得到其位移向量。再给其一个速度,再用距离判断是否开始计算移动到下个点。
2)
通过将地图分割为二维数组来存储,路径可以根据情况存储为二维数组的行列索引。根据路径索引找到对应的路径,控制怪物依此行走。
4、继承和接口的用法和区别?
. C#只支持单继承,而接口则可以实现多继承。
· 继承父类的子类不一定要实现父类中的所有方法,但继承接口的类必须实现接口中的所有方法。
· 父类中的方法可以是虚方法,也可以是非虚方法,但接口中的所有方法都只能是虚方法。
· 父类中的字段、属性以及方法等可以使用除public以外的访问修饰符,但接口中的方法只能使用public修饰符(并非不能,只是不这么做接口的意义就没了)。
· 父类中可以定义字段(类似”string str”这样的叫做字段),而接口中只能定义属性(类似”public string {get; }”这样的叫做属性)。
5、如何控制子弹发射频率,技能冷却时间等?
思路1:控制时间间隔就可以了,参考官网例子里的太空射击,
public float shootRate = 2;
private float timer;
void Update()
{
timer += Time.deltaTime;
if (timer>=shootRate)
{
timer = 0;
//发射子弹或者技能冷却结束
}
}思路2:通过可以通过协程来实现,例如,点击发射按钮后,至少隔3秒才能进行下一次发射。
private bool _isCanFire = true; // 点击发射按钮之后 void Fire () { StartCoroutine(Shoot()); } private IEnumerator Shoot() { if (_isCanFire) { _isCanFire = false; //发射子弹的逻辑 } Yield return WaitForSeconds(3); _isCanFire = true; }
6、Unity的GameObject.find是深度优先还是广度优先?
深度优先,find会去逐个查找物体下的子物体,并查询到最下一层级的同名物体。
我们了解到深度优先是一种类似递归的搜索算法(就是一条路走到底,还找不到就返回走第二条路)
广度优先刚好相反,是只要有岔路都走个遍,走到下一个拐点要是还有岔路也都先探一探酱紫。