12月到了,新的一月,新的开始。今天终于完成了新的一个案例学习-2D坦克大战,小时候玩的非常经典的游戏,学习资源仍然是siki学院课程(http://www.sikiedu.com/my/course/90),这个课程的总结暂不进行。在学习的过程中有一些心得想要总结下来,这篇随笔就是记录这些心得。
一.你干你的,我干我的
在这几天学习的几个案例中,最直观的一点就是每一个物体都有自己的脚本,用于控制当前物体的生老病死,这样有效地降低了代码的耦合性,也使得代码更加清晰和便于阅读。如发射子弹的功能,当子弹被实例化出来之后,子弹的控制发射方就不用管了,在子弹上添加专门的脚本用于控制子弹的运动和销毁。
同时,有一些脚本之间相互调用的情况不可避免,这时可以使用消息发送机制、单例模式等方式去调用更改。
二.游戏物体的运动
游戏物体的运动有多种方法控制,这段时间的案例中采用的方法我觉得可以分为两类:
1.直接使游戏物体位置改变,不模拟真实的物理世界
Translate方法:
transform.Translate(Vector3.right * h * Time.fixedDeltaTime * moveSpeed ,Space.World)
MoveTowards方法
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
此外,还有线性插值、球形插值等方法
2.模拟真实的物理世界的运动
通过刚体组件施加速度、力、旋转等方法模拟物理世界
rigidbody.velocity = (transform.forward * v + transform.right * h) * speed;
rigidbody.angularVelocity = transform.up * h * angularSpeed;
三.加载场景
使用协程加载场景是一个不错的方法,在加载场景时一般要等待几秒钟,同时可以使用invoke方法等待一小段时间并加载场景。
//开启结束游戏的协程 StartCoroutine(GameOverAnimation());
//结束游戏的协程 IEnumerator GameOverAnimation() { //暂停一秒 yield return new WaitForSeconds(1);
//其他代码 //重新加载场景 SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }
使用协程加载场景
//在1秒延迟之后调用游戏结束的方法 Invoke("GameOver",1); //结束游戏的方法 private void GameOver() { //重新加载场景 SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }
使用invoke延迟调用
协程和invoke的区别参,虽然CSDN中重复的比较多,这些文字我找到了好几个一摸一样的,但是还是基本讲清楚了两者的区别。在使用中,协程相当于新开了一个update函数,如果要在结束游戏的时候进行像摄像机镜头拉近、改变背景等操作的话,使用协程更为方便,invoke是一种委托机制,而且调用的方法不能有参数,但是应用在调用定时执行的函数时更为方便。
四.杂谈
作为一个初学者,有很多老手已经味同嚼蜡的东西对于我来说非常有新鲜感,而且学习需要不断熟悉知识,不断掌握新的范式,所以如果我的文章有幸被你看到的话,您有任何的建议或者发现我哪里有错误的话都可以给我留言,我们可以一同讨论。