学习总结

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的区别参见https://blog.csdn.net/luozhihua_as/article/details/81297196,虽然CSDN中重复的比较多,这些文字我找到了好几个一摸一样的,但是还是基本讲清楚了两者的区别。在使用中,协程相当于新开了一个update函数,如果要在结束游戏的时候进行像摄像机镜头拉近、改变背景等操作的话,使用协程更为方便,invoke是一种委托机制,而且调用的方法不能有参数,但是应用在调用定时执行的函数时更为方便。

四.杂谈

  作为一个初学者,有很多老手已经味同嚼蜡的东西对于我来说非常有新鲜感,而且学习需要不断熟悉知识,不断掌握新的范式,所以如果我的文章有幸被你看到的话,您有任何的建议或者发现我哪里有错误的话都可以给我留言,我们可以一同讨论。

posted @ 2020-12-02 00:05  movin2333  阅读(116)  评论(0编辑  收藏  举报