说明:以下代码都是 C#,博客中的代码块功能我还不太熟练,如果图片未加载出来可以访问 远浪的个人博客 - 欢迎 (yuanlang.icu) 查看全文

学习成果:C# 和 JAVA 非常的像,就是调用对象的方法,具体的方法基本已经有了,只需要给定参数即可使用,对象.useGravity = true/false 可以给对象施加重力或不施加重力,这里不加重力可以模拟在太空中的情形,我完全想不到居然这么方便的,之前一直以为这些算法都需要自己写,现在知道了,大部分都有现成的直接调用,应该除了一个很冷门的功能,需要自己写之外。对象.addForce(x,y,z) 方法给 xyz 轴施加一个多大的力,这里可以配合键盘输入,使用 if 判断键盘输入哪个值(Input.GetKey("d")),然后在什么方向加力,可以使物体移动起来。

相机跟随,这里新建一个组件,并且相机对象中新建一个脚本 FollowPlayer ,然后将想要跟随的对象添加到里面

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    public Vector3 offset;

    // Update is called once per frame
    void Update()
    {
        transform.position = player.position + offset;
    }
}

这里的 Transform 类型其实可以理解为位置变化,这里的 player 就是我们所要跟随的那个对象,Vector3 是指三个数,默认为 0,然后我们要使用这三个数来给位置添加 x,y,z 上的位置偏移,不然相机会显示第一视角,这样就看不到物体了。

                                              

Unity 学习记录_Text


这个 Rigidbody 组件很重要,向对象添加 Rigidbody 组件就能把组件变为刚体,符合一些正常的运动逻辑和碰撞逻辑,这个差点忘记记下来了。

函数之间嵌套调用

           

Unity 学习记录_游戏开发_02

这里将 PlayerCollision 定义了一个参数,类型是之前的 PlayerMovement 然后将空的槽填入 PlayerMovement 脚本如上图,这段代码的意思是,与标签为 “Obstacle”的对象发生碰撞则不能再移动\

public class PlayerCollision : MonoBehaviour

{

    public PlayerMovement movement;


    void OnCollisionEnter(Collision collisonInfo)

    {

        if(collisonInfo.collider.tag == "Obstacle")

        {

            movement.enabled = false;

        }

    }

}

public class FollowPlayer : MonoBehaviour
{
    public Transform player;
    public Vector3 offset;

    // Update is called once per frame
    void Update()
    {
        transform.position = player.position + offset;
    }
}




点击对象在 Layer 属性中新建一个 Envirement,选中刚刚新建的 Envirement 然后点击上方的 Layers 点击禁用 Envirement,这样在工作视图中,就不会选中这个对象了,避免在操作其他对象时选中这个不需要的对象造成麻烦。

Unity 学习记录_加载_03

刚体(Rigibody)这里的 Drag 是阻力(空气阻力)


Unity 学习记录_游戏开发_04


右键左侧对象区,点击 UI - Text 创建一个画布和 Text 框,然后点击进入 2D 模式可以查看和编辑 Text 框中的内容


Unity 学习记录_游戏开发_05


绑定 TMP 到脚本中,这里要注意需要引入 TMPro 因为 TMP 并不存在于 UnityEngine 中,这里需要注意参数类型需定义为 TextMeshProUGUI 类型,不然无法将 TMP 组件绑定到脚本中

using UnityEngine;

using TMPro;


public class Score : MonoBehaviour

{


    public Transform player;

    public TextMeshProUGUI scoreText;


    // Update is called once per frame

    void Update()

    {

        scoreText.text = player.position.z.ToString();

    }

}


新建一个空对象命名为 GameManager 用于控制游戏结束,然后在这个对象上新建一个组件脚本 GameManager ,代码如下:

using UnityEngine;

using UnityEngine.SceneManagement;


public class GameManager : MonoBehaviour

{

    bool gameHasEnd = false;


    public float restartDelay = 1f;


    public void EndGame()

    {

        if (gameHasEnd == false)

        {

            gameHasEnd = true;

            Debug.Log("Game Over");

            // 使用 Invoke 函数,延迟调用 Restart 方法,这里延迟两秒调用

            Invoke("Restart", restartDelay);

        }

    }


    void Restart()

    {

        SceneManager.LoadScene(SceneManager.GetActiveScene().name);

    }

}



这里使用了 UnityEngine.SceneManagement Unity场景管理包,用于在游戏结束后重新加载场景(通俗一点讲就是游戏结束后重新开始游戏),这里游戏结束有两种情况,一是发生碰撞游戏结束,所以需要啊玩家碰撞脚本(PlayerCollision)中添加一行 FindObjectOfType<GameManager>().EndGame(); 代码,这里为什么不用类名直接示例一个对象然后将对象拖入建立连接呢?寻找 GameManager 类的实例对象,不然的话如果使用直接类名定义一个对象的话,操作界面中对象被删除,与其连接的脚本关系也会被删除。二是玩家掉出区域,这里可以判断玩家位置的 y 轴是否为 -1 从而得知玩家是否掉出了区域,所以只需要在玩家移动(PlayerMovement)脚本中添加判断玩家 y 轴位置,这里依然使用查找类型对象的方式获取 EndGame() 方法,代码如下:

if(rb.position.y < -1f)

{

    FindObjectOfType<GameManager>().EndGame();

}

特别说明一下,游戏开发需要很多个场景,每次做完一个场景之后需要在 file - buildSetting 中点击添加场景


触发器:这里把一个方块对象当做一个触发器,把网格渲染去掉,然后在 Box Collider 中勾选 Is Trigger 选项


Unity 学习记录_游戏开发_06

新建并给这个方块添加触发器脚本,代码如下

using UnityEngine;


public class EndTrigger : MonoBehaviour

{

    public GameManager Manager;


    void OnTriggerEnter()

    {

        Manager.completeLevel();

    }

}


使用 OnTriggerEnter 方法当触发器发生时调用 Manager 中的 completeLevel 方法,在 GameManager 类中添加代码:

public GameObject CompleteUI;


public void completeLevel()

{

    CompleteUI.SetActive(true);

}

这里是意思的调用这个方法然后显示成功通关的提示,需要与显示的对象建立联系,毕竟定义了一个对象

触发器发生后,我们给这个显示的对象做了一个过渡动画让它显示时不那么生硬,window - animation 打开动画窗口,这里跟 pr 做动画一样,只需要打开记录模式然后将指针移到关键帧位置,之后对这个对象进行相应的操作即可,这里调用触发器时会自动播放动画不需要在指定动画播放了。

加载下一关卡:

这里在播放完动画后,进入下一关卡,只需要在动画窗口中选中刚刚添加动画的对象然后在指定位置添加一个事件


Unity 学习记录_游戏开发_07

然后给对象添加事件脚本,还要在动画窗口点击该事件添加事件方法,事件脚本代码如下:

using UnityEngine;

using UnityEngine.SceneManagement;


public class LevelCompete : MonoBehaviour

{

    public void LoadNextLevel()

    {

        // 加载下一个场景,但是这里使用 buildIndex + 1 新建一个场景

        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);

    }

}

这里再新建一个场景然后在 file-buildSetting 中添加该场景即可,在该窗口看对应的 index,这里的 index 可以用做场景直接的跳转。



添加游戏开始菜单和通关游戏结束菜单:

新建一个场景,创建画布调整画布的背景色和透明度,再按照自己的设定设计 UI 界面


Unity 学习记录_触发器_08


这里要注意的是按钮绑定事件中的脚本是要在 Credits 上面添加脚本组件


Unity 学习记录_Text_09


然后将 Credits 整个对象与按钮中的 On Click 建立连接,并且将脚本中的方法绑定到事件中


Unity 学习记录_触发器_10


脚本代码如下:

using UnityEngine;

public class Credits : MonoBehaviour

{

    public void Quit()

    {

        Debug.Log("Quit");

        // 退出应用

        Application.Quit();

    }

}


这里开始菜单也和结束菜单一样的流程,只不过脚本代码编写不一样了,点击开始按钮需要转场,使用场景管理器(SceneManager)转向下一个场景,代码如下:

using UnityEngine;

using UnityEngine.SceneManagement;


public class Meun : MonoBehaviour

{

    // 点击开始按钮后,跳转到下一个场景

   public void StratGame()

    {

        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);

    }

}


导出 unity 项目,在导出之前需要点击 edit - project setting - quality 设置自己需要的导出的质量。


Unity 学习记录_Text_11


这里要分别设置三种不同的 quality,具体看自己的需求。



点击 edit - project setting - player 配置导出的项目名称,应用图标等等。


Unity 学习记录_触发器_12



这里制作图标可以使用 PS,制作完之后可以直接将 PSD 格式的文件导入到项目文件中,然后点击该文件配置一下参数。


Unity 学习记录_加载_13


然后在 project - setting - player 中配置有关游戏时窗口大小,图标等等参数。


Unity 学习记录_加载_14


配置完自己想要的效果后,点击 file - build setting,导出游戏 exe。


Unity 学习记录_Text_15


这里有一个可扩展的点,就是如果想让别人玩到你做的游戏,在打包好后,可以直接把文件压缩成 Zip 发给自己的朋友,但是如果想发到网上去供别人下载安装,则需要下载一个 installer 帮助生成一个安装器,就像网上在网上下载软件一样的 setup 并且记得标明版本和可供游戏的操作系统,这里可以生成 installer 的软件网址是 www.jrsoftware.org/isdl.php (installer)

Unity 学习记录_Text_16