目录

7.创建角色

8.在坦克上面创建血条

9.为游戏对象添加NetworkTransform

10.角色移动

11.摄像机相随

12.炮台移动

测试


7.创建角色

新建一个立方体Player,取消它的外形渲染,然后将位置放在(0,0,0),同时将预制体拉入场景中,成为Player的子物体,同时它的位置也设置为(0,0,0),最后将Mesh Renderer组件移除,这样就看不到网格轮廓
由于坦克物体太大,因此缩放一下
同时将Player的碰撞属性设置一下
因为坦克的一些部件是单独的,而转向过程中需要多个物体同时进行,所以要进行合体

8.在坦克上面创建血条

首先创建一个画布,将画布设置世界空间,即可以被摄像机看到
在画布下新建一个text,然后设置相关属性,表示坦克的名字
角色创建完毕后,将该物体保存成预制体,并在场景中删除

9.为游戏对象添加NetworkTransform

NetworkTransform是一个可以在客户端同步物体对象位置、旋转和缩放到服务器的组件,添加它时必须要加入NetworkIdentity,之后将信息从服务器同步到其余客户端

10.角色移动

在Player物体中添加Player脚本
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class Player : NetworkBehaviour
{private Rigidbody rb;public float MoveSpeed = 8; //水平和垂直的速度private void Awake(){rb = transform.GetComponent<Rigidbody>();}private void FixedUpdate(){if (!isLocalPlayer) return; // 如果不是本地角色,就跳过Vector2 moveDir;// 获取键盘输入的水平和纵向的值,分别是1和-1,代表两个方向,并传给moveDir这个方向变量if (Input.GetAxisRaw("Horizontal") == 0 && Input.GetAxisRaw("Vertical") == 0){moveDir.x = 0;moveDir.y = 0;}else{moveDir.x = Input.GetAxisRaw("Horizontal");moveDir.y = Input.GetAxisRaw("Vertical");Move(moveDir);}}void Move(Vector2 direction = default(Vector2)){if (direction != Vector2.zero) // 如果方向变量不是零向量{transform.rotation = Quaternion.LookRotation(new Vector3(direction.x, direction.y, 0)); // 调整方向//transform.forward是一个变量,它是根据当前方向计算出的方向变量Vector3 movementDir = transform.forward * MoveSpeed * Time.deltaTime; // 当前方向的单位向量 * 速度 * 时间 = 当前方向的偏移量  rb.MovePosition(rb.position + movementDir);}}}
其中速度*Time.deltaTime保证在不同帧数下角色移动的速度是一样的,也就是与帧数无关。
知识补充:
(1)Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关。在性能好的机器上可能fps60,差的可能小些。这会导致同一个游戏在不同的机器上效果不一致,有的快有的慢,因为Update的执行间隔不一样了。
(2)FixedUpdate是在固定的时间间隔执行,不受游戏帧率的影响。Tick:在处理Rigidbody的时候最好用FixedUpdate

11.摄像机相随

新建CamFollow脚本,添加到GameScene场景的主摄像机上
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamFollow : MonoBehaviour
{public Transform target;public float distance = 10f;public float height = 5f;void Update(){if (!target) return; //没有获得玩家坐标就return//获取当前摄像机的旋转角度,返回一个四元数Quaternion currentRotation = Quaternion.Euler(0, transform.eulerAngles.y, 0);Vector3 pos = target.position; //得到玩家的坐标// 四元素*(0,0,1)=当前旋转方向上1单位的距离,再*距离=当前旋转方向上的距离(一个Vector)pos -= currentRotation * Vector3.forward * Mathf.Abs(distance);pos.y = target.position.y + Mathf.Abs(height); //在y方向上偏移一定的高度,相当于将摄像机的x和z轴定死transform.position = pos; // 将计算完后的pos赋值给摄像机transform.LookAt(target); // 当前摄像机指向玩家// 画蛇添足,对游戏效果没有影响,留坑//transform.position = target.position - transform.forward * Mathf.Abs(distance);}
}
由于Player是预制体,所以无法得到target的transform,因此需要在Player脚本中写一段代码,表示被创建时,将它的transform信息传给主摄像机的CamFollow脚本的target中即可,就实现了映射。
【坑点一】重写OnStartLocalPlayer无效,在Awake函数中有效,添加的代码如下:
Camera.main.GetComponent<CamFollow>().target = transform;
填坑不小心把Player中Networkidentity中弄成了强制隐藏,因为界面上会有Mirror的标志,所以设置成隐藏,没想到这里的隐藏是使它失效,应该设置成默认。
最后添加以下函数有效
public override void OnStartLocalPlayer()
{Camera.main.GetComponent<CamFollow>().target = transform;
}
如此可以实现摄像机跟随

12.炮台移动

在Player.cs的FixedUpdate函数中添加如下代码:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 返回从摄像机到当前鼠标点的一个射线
Plane plane = new Plane(Vector3.up, Vector3.up); // 新建一个平面,因为玩家对象在(0,0,0),所以参数中的法线和经过的点都是(0,1,0)
float distance = 0f;
Vector3 hitPos = Vector3.zero;
// 判断平面和射线是否相交,并将射线起点到交点的距离返回给distance
if (plane.Raycast(ray, out distance))
{hitPos = ray.GetPoint(distance) - transform.position; // 获得射线在distance位置的坐标 - 玩家的坐标 = 相对玩家的交点坐标
}
RotateTurret(new Vector2(hitPos.x, hitPos.z)); // 因为炮台转向的是在一个平面上进行的,在unity中是x和z轴
在Player.cs添加如下函数:
void RotateTurret(Vector2 direction = default(Vector2)) // 防空出错
{if (direction == Vector2.zero) return;// 因为炮台的z轴要指向射线和平面的交点,所以用LookRotation函数,只需要用到forward参数即可(z轴指向forward),// 最后返回一个表示旋转的四元数,并得到它转换后欧拉角中绕y轴旋转的角度int newRotation = (int) (Quaternion.LookRotation(new Vector3(direction.x, 0, direction.y)).eulerAngles.y);  //因为旋转,实际上是绕y轴旋转的,所以将y轴旋转的角度封装成四元数赋值给炮台的rotation即可turret.rotation = Quaternion.Euler(-90, newRotation, 0); //因为炮台本来就旋转了-90,所以这里要不变
}
将炮台加入变量中

测试

【Unity3D-Mirror多人坦克大战】坦克生成、移动和摄像机跟随(二)相关推荐

  1. c语言编程简单小游戏坦克大战,坦克大战1990(c语言文件版)游戏

    坦克大战1990(c语言文件版)是一款很炫的坦克战争类游戏.游戏设计感很强.敌人千变万化,但是你可别被迷惑哦,将他们通通歼灭吧! 作者的话 经过四五天的奋斗,第一次编的游戏终于完成了,好激动. 首先得 ...

  2. 网页版坦克大战坦克换方向原理

    首先我们需要一个包含坦克四个方向的图片,是一个图片不是四个图片.然后图片的高宽细节也可以知道,将此图片设置为div的背景图,同时根据你图片的方去选择设置background-y或者background ...

  3. 坦克大战-C语言-详注版

    代码地址如下: http://www.demodashi.com/demo/14259.html 坦克大战-C语言-详注版 概述 本文详述了C语言版坦克大战游戏的原理以及实现方法,对游戏代码进行了详细 ...

  4. JavaScript面向对象实现-坦克大战(附前端全套学习路线)

    [课程简介] 使用javascript+面向对象实现一个坦克大战游戏,让更多的同学能更加深入地理解面向对象思想. [主讲内容] 1. 讲解什么是面向对象,javascript中如何实现面向对象 2. ...

  5. HTML5经典坦克大战及源码

    目录 一.简单介绍 二.具体界面 主界面 排行榜界面 组员信息界面 组员信息场景 三.部分代码 3.1 界面绘制的实现 6.2 坦克移动实现 3.3 发射炮弹 3.4声音处理 3.5计分 四.总结 一 ...

  6. 坦克大战进阶第三版:防止重叠、击杀记录、存盘退出、背景音乐等

    坦克大战进阶第三版:防止重叠.击杀记录.存盘退出.背景音乐等 1. 坦克大战0.5版 1.1 功能进阶: 增加功能[HspTankGame05java] 防止敌人坦克重叠运动[思路->走代码] ...

  7. C++实现坦克大战(新手思路)

    C++实现坦克大战(新手思路) 第一次写,写的不好,还请多多包涵,本人也是第一次学习C++,因为在15派学习原因才接触到这个,本文仅仅提供我个人的一个思路. 效果图 项目实现的功能 实现的功能: 坦克 ...

  8. Java课程设计——坦克大战

    坦克大战--坦克类 一. 团队课程设计博客链接 https://www.cnblogs.com/chenhuilin/p/10275664.html 二.个人负责模块和任务说明 模块:坦克类(玩家坦克 ...

  9. 坦克大战java_Java课程设计——坦克大战

    坦克大战--坦克类 一. 团队课程设计博客链接 二.个人负责模块和任务说明 模块:坦克类(玩家坦克类+电脑坦克类),代码整合 三.代码的提交记录截图 四.负责模块和任务详细说明 玩家坦克继承Visib ...

  10. C语言编写的坦克大战exe小游戏

    C语言编写的坦克大战exe小游戏! (含有部分C++函数,不过不需要知道实现细节,主要用于键盘读取等) 适合初学者学习的坦克大战代码,无图片,游戏全部功能画面显示全部由 printf 打印的哦! C+ ...

最新文章

  1. 如何使用JavaScript漂亮地打印JSON?
  2. python字符串小数转化整数_python – Pandas将字符串列和NaN(浮点数)转换为整数,保持NaN...
  3. Python入门100题 | 第069题
  4. 【CodeIgniter 】解惑
  5. linux ffmpeg加速和合并视频命令
  6. comsol如何设置距离梯度_使用 COMSOL 软件求解经典 CFD 基准问题:顶盖驱动空腔...
  7. 鸿蒙开发者社区入口,鸿蒙OS 社区
  8. Lintcode--4(1)--A+B
  9. ShuttleFlow 2.0版本跨链协议上线,同时支持OKExChain、Heco及BSC双向互操作
  10. 指标公式c语言源码下载,自用60分钟指标源码
  11. krb5安装包 linux_Linux:krb5
  12. android电视自动关机,Android定时关机问题解决
  13. 电脑主板原理图讲解(电脑主板构造图文详解)CPU和北桥芯片(随着发展有的北桥已经被设计到CPU内部了)南桥芯片
  14. Dictionary:MAC字典最简解决方案
  15. 网络:IP基础知识总结
  16. 大数据的处理是怎样的过程
  17. 新家入住气味难忍 除去甲醛有妙招
  18. 机器学习-Sklearn-01(决策树)
  19. 如何将.m4a转.wav文件
  20. 摄像头的车牌识别(用hyperlpr的车牌识别,python版本)

热门文章

  1. rtmp推流工具_小熊录屏:支持RTMP直播录屏的手机APP——墨涩网
  2. javascript严格模式详解
  3. 2022 世界人工智能大会,都讲了些啥?
  4. English--定语从句
  5. 在CentOS 6.3中安装拼音输入法 详细出处参考:http://www.jb51.net/os/RedHat/73029.html
  6. arcgis将直线等分_如何快速定数等分一条线段?
  7. 中国异VC钠市场预测与投资战略报告(2022版)
  8. Springboot中使用Shiro的配置与realm的构建
  9. PermissionError: [WinError 5] 拒绝访问。: ‘E:\\IdeaProjects\\maintenance\\dist\\main‘
  10. 2D shape decompositions二维形状分解