unity3d-多人坦克对战

这次的作业是在上一次坦克大战作业的基础上进行改进,实现多人网络对战版。

视频演示

https://www.bilibili.com/video/av25649733/

游戏实现

游戏主要对象还是利用了坦克预设和子弹预设。如下图:

这里写图片描述

将原本的脚本都去掉,然后为tank预设添加Network Identity和Network Transform组件,并且把Network Identity的local player authority选项勾上,以允许能够在本地进行控制。然后创建一个Empty对象并挂载Network Manager和Network Manager HUD脚本,作为整个游戏的网络管理对象。同样的道理,子弹也应该添加Network Identity和Network Transform组件,注意子弹不需要勾选local player authority,并且Network Send Rate设为0即可。最后还要在Network Manager的Spawn Info里面注册相应的预设。具体设置如下:

这里写图片描述
这里写图片描述
这里写图片描述

主要代码

为坦克添加控制脚本PlayerMove。Update()函数首先判断是不是本地对象执行,只有是服务端对象执行才可以修改坦克的位置,通过监听按键输入来控制刚体组件相应的速度来实现。当按下空格的时候,坦克开火。我使用了AddForce来控制子弹实例的刚体运动。如果直接在本地执行函数CmdShoot中使用,会出现client端子弹产生后不会运动的效果。(原因可以查一下谷歌:unity3d network transform addforce not working)。这里需要将AddForce函数放在一个ClientRpc函数中调用,这样才可以在所有客户端中同步。

其他的代码比较简单,这里就不累述。注意下两个函数:OnStartClient()和OnStartServer()。这两个函数分别在客户端对象和服务端对象产生时调用,这里我使用它们的目的是将对象的transform传递给main camera,使得main camera可以根据坦克对象的位置自动更新视野。

pub
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个简单的Unity3D坦克游戏的C#代码示例: ```csharp using UnityEngine; public class TankController : MonoBehaviour { public float moveSpeed = 5f; // 坦克移动速度 public float rotateSpeed = 20f; // 坦克转向速度 public GameObject bulletPrefab; // 子弹预制体 public Transform firePoint; // 开火点 public float bulletSpeed = 10f; // 子弹速度 public float bulletInterval = 0.5f; // 发射子弹的时间间隔 private float lastBulletTime = 0f; // 上次发射子弹的时间 private Rigidbody tankRigidbody; // 坦克刚体 void Start() { tankRigidbody = GetComponent<Rigidbody>(); } void Update() { // 获取玩家输入 float h = Input.GetAxisRaw("Horizontal"); float v = Input.GetAxisRaw("Vertical"); // 移动坦克 Vector3 moveDir = new Vector3(h, 0, v).normalized; tankRigidbody.MovePosition(transform.position + moveDir * moveSpeed * Time.deltaTime); // 转向坦克 Vector3 rotateDir = new Vector3(0, h, 0); Quaternion deltaRotation = Quaternion.Euler(rotateDir * rotateSpeed * Time.deltaTime); tankRigidbody.MoveRotation(tankRigidbody.rotation * deltaRotation); // 发射子弹 if (Input.GetKeyDown(KeyCode.Space) && Time.time - lastBulletTime > bulletInterval) { Fire(); lastBulletTime = Time.time; } } void Fire() { GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation); Rigidbody bulletRigidbody = bullet.GetComponent<Rigidbody>(); bulletRigidbody.velocity = firePoint.forward * bulletSpeed; } } ``` 这个脚本可以挂载在坦克上,控制坦克的移动、转向和发射子弹。需要注意的是,这个代码示例只是一个基础的框架,还需要根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值