【框架设计】3D坦克大战

这篇博客介绍了双人游戏的开发要点,包括如何实现镜头跟随双玩家的动态调整,利用预制体简化坦克模型的复用,设置键盘操作映射以支持双人对战,以及子弹碰撞后的处理。同时,提到了游戏结束后的UI界面及其功能代码。
摘要由CSDN通过智能技术生成

游戏设计好,思考使用什么资源后,需要思考开发的具体功能。以下是个人总结的几个比较重要的思考点。

游戏镜头

由于设计是单机双人的游戏,镜头跟随效果不能是平时简单的跟随单物体移动,而是要在两个物体的重心。并且,两个物体在独立移动时,两者的距离会发生较大的变化,在同样的程序窗口上显示画面,两者距离变近时,相机应当变近,两者距离变远后,相机也应该跟着变远。

    public Transform p1; //玩家1的坐标
    public Transform p2; //玩家2的坐标
    private Vector3 offset; //用于计算坐标位置补偿值
    private Camera ca;
    float distance = 0;
    float size = 0;

    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - (p1.position + p2.position) / 2; //计算相机初始位置与两个玩家中心点的偏移量
        ca = this.GetComponent<Camera>(); //初始化相机
    }

    // Update is called once per frame
    void Update()  
    {
        if (p1 == null || p2 == null)
        {
            return; //当有一方坦克销毁时,不再进行相机运算
        }
        transform.position = (p1.position + p2.position) / 2 + offset; //相机保持偏移,位于两个玩家正中心

        //下面代码用于计算相机缩放比,0.62f是经过我自己摆放相机位置得出的一个看起来比较舒服的比例
        distance = Vector3.Distance(p1.position, p2.position);
        size = distance * 0.62f;
        ca.orthographicSize = size;
    }

预制体的使用

双人对战,场景中会有两辆坦克,为了简化开发过程,可以首先把一个坦克模型建立好,为其增添好如刚体插件、脚本等内容,作为一个预制体。再通过预制体实例化出两个不同的实体坦克,分别对其进行编辑。

 通过预制体创建的两个实例

键盘操作映射

双人对战,场景中就会有两辆坦克,就要对应两套不同的键盘操作。

为两个玩家设置两套不同的虚拟轴 

子弹飞行

子弹射出坦克后,本身就成为一个实体,该实体拥有独立的碰撞检测,并且在碰撞后产生爆炸效果,如果碰撞的是坦克,则造成伤害。

public GameObject shellExpPrefab; //子弹预制体
public AudioClip shellExpAudio; //子弹爆炸音效

public void OnTriggerEnter(Collider other) //当子弹遭遇碰撞时触发该代码
{
    AudioSource.PlayClipAtPoint(shellExpAudio, transform.position); //产生爆炸音效
    GameObject.Destroy(this.gameObject); //销毁子弹自身
    GameObject.Instantiate(shellExpPrefab, transform.position, transform.rotation); //播放爆炸动画
    if(other.tag == "Tank") //如果与坦克发生碰撞,将碰撞信息传递给坦克,告诉坦克触发受伤代码
    {
        other.SendMessage("injury");
    }
}

设计框架图

 游戏结束UI界面

UI布局如下,并将其初始显示状态设置为不显示

 

using UnityEngine.SceneManagement; //使用最新的SceneManagement的函数需要用这个库


//再玩一次按钮功能代码
public void ReStartGame()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}


//退出游戏按钮功能代码
public void ExitGame()
{
    Application.Quit();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值