天蚕土豆场景复现

一、场景抽象

将小说场景中的神兽之原抽象为一块一块的方块,让人物在方块之间不断跳跃前进。
顺便给相机加上天空盒,更加贴近小说画面。

二、“神兽之原”实现

提前预制红色方块作为神兽之原的一小个单位,在加载时随机选择生成的位置。
总共有三列位置可以生成小方块,确保每次有且只有两列生成了红色方块。
预制如下:

随机生成代码如下:

public class random : MonoBehaviour
{// Start is called before the first frame updatepublic GameObject cube1, cube2, cube3, cap;private int l, m, r;private float t1, t2;void Start(){t1 = 0;int h = 100;int z = -4;while (h>0){r = m = l = 0;while(l+m+r != 2){//Random r = new Random();l = UnityEngine.Random.Range(0, 2);m = UnityEngine.Random.Range(0, 2);r = UnityEngine.Random.Range(0, 2);}h--;z += 2;if (l == 1){cube1 = GameObject.Instantiate(Resources.Load("Cube")) as GameObject;cube1.transform.position = new Vector3(-2, -1, h);}if (m == 1){cube2 = GameObject.Instantiate(Resources.Load("Cube")) as GameObject;cube2.transform.position = new Vector3(0, -1, h);}if (r == 1){cube3 = GameObject.Instantiate(Resources.Load("Cube")) as GameObject;cube3.transform.position = new Vector3(2, -1, h);}}}// Update is called once per framevoid Update(){}
}

三、角色控制类

选择新建胶囊体代表游戏角色(小说中的主角),并使用 角色控制器 来操纵物体移动。
新建空对象并命名为:Player ,再将相机拖入Player中成为其子对象。
对象结构如下:

Player的Inspector属性如下:

将键盘输入映射到角色控制器的移动代码Player Move如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMove : MonoBehaviour
{//定义一个移动速度MoveSpeed 其类型为public类型public float MoveSpeed;//用户在PlayerMove脚本界面可以对其进行调整//(用public定义,脚本外可以修改,并以脚本外修改的为主)//(如果是private类型则只能在脚本修改)//定义两个私有类型的浮点型数据horizontal和vertical来记录A、D键和//W、S键的数据,也可以理解为记录水平轴和竖直轴的数据,即X轴和Y轴 private float horizontal;private float vertical;//定义一个重力gravity private float gravity = 9.8f;//定义一个起跳速度public float JumpSpeed = 0.1f;//定义一个公有类型的CharacterController,将其命名为PlayerController//用于实例化对象public CharacterController PlayerController;//定义一个Vector3//Vector3向量既可以用来表示位置,也可以用来表示方向//在立体三维坐标系中,分别取与x轴、y轴,z轴方向相同的3个单位向量i,j, k作为一组基底。//若a为该坐标系内的任意向量,以坐标原点O为起点作向量OP=a。由空间基本定理知,有且只有一组实数(x,y, z)//使得 a=向量OP=xi+yj+zk,因此把实数对(x,y, z)叫做向量a的坐标//记作a=(x,y, z)。这就是向量a的坐标表示。其中(x,y, z),也就是点P的坐标。向量OP称为点P的位置向量。Vector3 Player_Move;//放在Updata里面每一帧都会执行,导致不能够保存前一时刻的值   // Start is called before the first frame updatevoid Start(){MoveSpeed = 10;}void Update(){//判断PlayerController是否在地面上,如果不是在地面上就不能够前后左右移动,也不能够起跳if (PlayerController.isGrounded){//Input.GetAxis("Horizontal")为获取X(横轴)轴方向的值给horizontalhorizontal = Input.GetAxis("Horizontal");//Input.GetAxis("Vertical")为获取Z(纵轴)轴方向的值给Verticalvertical = Input.GetAxis("Vertical");//transform为本物体所在位置,forward是向前的一个分量//transform.forward * vertical为物体向前的方向乘获取的Z轴的值,即物体向前移动的量,如果vertical为负数,则物体后退//transform.right * horizontal为物体向右的方向乘获取的X轴的值,即物体向右移动的量,如果horizon为负数,则物体向左//两者相加后最后面乘移动数度,赋值给Vector3类型的Player_Move即为物体实际运动的方向           Player_Move = (transform.forward * vertical + transform.right * horizontal) * MoveSpeed;//判断玩家是否按下空格键if (Input.GetAxis("Jump") == 1){//按下空格键,给其竖直方向添加一个向上的数度,使其跳起//Player_Move.y相当于Player_Move下的Vector3(0,1,0)Player_Move.y = Player_Move.y/2 + JumpSpeed/2;}}//模拟重力下降的效果,让向上的量减去重力下降的量//变量deltaTime表示为unity本地变量,作为Time类中的数据在各帧中被更新,在各帧中,该变量显示了距上一帧所经历的时间值(以秒计算)。 //这个变量的优点: 使用这个函数他会与你的游戏帧速率无关 放在Update()函数中的代码是以帧来执行的//我们需要将移动的物体乘以秒来执行,而乘以deltaTime其就可以实现 //例如:想让一个游戏对象向前以每秒10m移动的话 用你的速度10乘Time.deltaTime  他表示每秒移动的距离为10m而不是每帧10m      Player_Move.y = Player_Move.y - gravity * Time.deltaTime;//PlayerController下的.Move为实现物体运动的函数//Move()括号内放入一个Vector3类型的量,本例中为Player_MovePlayerController.Move(Player_Move * Time.deltaTime);}}

控制相机的脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraControlle : MonoBehaviour
{//创建一个Transform类型的量CameraRotation用来保存实现相机旋转public Transform CameraRotation;//定义两个私有类型的量Mouse_X,Mouse_Y分别接收鼠标向各个方向滑动的值private float Mouse_X;private float Mouse_Y;//鼠标灵敏度public float MouseSensitivity;//定义一个浮点类型的量,记录绕X轴旋转的角度public float xRotation;// Start is called before the first frame updatevoid Start(){}// Update is called once per frame//放在Updata里面每一帧都会执行,导致不能够保存前一时刻的值 void Update(){//获取鼠标左右移动的量乘上灵敏度的值Mouse_X = Input.GetAxis("Mouse X") * MouseSensitivity * Time.deltaTime;//获取鼠标上下移动的量乘上灵敏度的值Mouse_Y = Input.GetAxis("Mouse Y") * MouseSensitivity * Time.deltaTime;xRotation = xRotation - Mouse_Y;//xRotation值为正时,屏幕下移,当xRotation值为负时,屏幕上移//当鼠标向上滑动,Mouse_Y值为正,xRotation-Mouse_Y的值为负,xRotation总的值为负,屏幕视角向上滑动//当鼠标向下滑动,Mouse_Y值为负,xRotation-Mouse_Y的值为正,xRotation总的值为正,屏幕视角向下滑动//简单来说就是要控制鼠标滑动的方向与屏幕移动的方向要相同xRotation = Mathf.Clamp(xRotation, -90f, 90f);//限制 value的值在-90f,90f之间,如果xRotation大于90f,则返回90f,如果xRotation小于-90f,则返回-90f,否者返回xRotation;//相机左右旋转时,是以Y轴为中心旋转的,上下旋转时,是以X轴为中心旋转的CameraRotation.Rotate(Vector3.up * Mouse_X);//Vector3.up相当于Vector3(0,1,0),CameraRotation.Rotate(Vector3.up * Mouse_X)相当于使CameraRotation对象绕y轴旋转Mouse_X个单位//即相机左右旋转时,是以Y轴为中心旋转的,此时Mouse_X控制着值的大小//相机在上下旋转移动时,相机方向不会随着移动,类似于低头和抬头,左右移动时,相机方向会随着向左向右移动,类似于向左向右看//所以在控制相机向左向右旋转时,要保证和父物体一起转动this.transform.localRotation = Quaternion.Euler(xRotation, 0, 0);//this.transform指这个CameraRotation的位置,localRotation指的是旋转轴//transform.localRotation = Quaternion.Eular(x,y,z)控制旋转的时候,按照X-Y-Z轴的旋转顺规//即以围绕X轴旋转x度,围绕Y轴旋转y度,围绕Z轴旋转z度//且绕轴旋转的坐标轴是父节点本地坐标系的坐标轴}}

四、运行效果展示



视频展示链接:bilibili

天蚕土豆《大主宰》场景复现相关推荐

  1. 震惊!我用Python分析了天蚕土豆的玄幻三部曲竟然发现...

    今天在偶然网络上又看到了这个神梗: 恐怖如斯恐怖如斯恐怖如斯恐怖如斯- 印象深刻啊-又回到了2015年,我清晰地记得入坑晚的我我中考前一晚追完了<斗破苍穹>,才安心睡觉- 但是后来由于多方 ...

  2. (私人收藏)[资源整理]天蚕土豆小说和经典书籍共二十三本书待看书

    天蚕土豆小说和经典书籍共二十三本书待看书 <三体> <了不起的盖茨比> <人类简史> <人类群星闪耀时> <刀锋> <卡拉马佐夫兄弟& ...

  3. 打败Word干掉WPS,获得天蚕土豆青睐的橙瓜码字究竟有多好用?

    你是否还在占满桌面的文档而烦恼? 你是否还在为章节排序而不辞疲倦? 你是否还在为人物名称而绞尽脑汁? 你是否- 今天 橙瓜码字正式开启公测了! 作为码字界的新锐产品 橙瓜码字备受广大用户喜爱,只要用过 ...

  4. 【网络协议】万文长篇,带你深入理解 TCP;场景复现,掌握鲜为人知的细节(中)

    文章目录 前言 重传机制 超时重传 快速重传 SACK 方法 Duplicate SACK 滑动窗口 概念由来 窗口大小 发送方的滑动窗口 接收方的滑动窗口 流量控制 缓冲区与滑动窗口 窗口关闭 糊涂 ...

  5. 【网络协议】万文长篇,带你深入理解 TCP;场景复现,掌握鲜为人知的细节(下)

    文章目录 前言 握手失败 挥手失败 为什么是三次握手? 如何避免 SYN 攻击? MTU 与 MSS 那些事儿 TIME_WAIT 的巧妙设计 为什么 TIME_WAIT 等待的时间是 2MSL? 为 ...

  6. # 腾讯云TcaplusDB X 大主宰·大千世界|万道争锋,独领其风

    导言 「TcaplusDB给我们的业务帮了很大的忙」,每当从客户口中听到类似的话语,我们总是很开心.这不仅是因为TcaplusDB的目标就是以客户服务理念为中心,为客户解决问题,同时,这简简单单几个字 ...

  7. 腾讯数据库TcaplusDB X 大主宰·大千世界|万家决战,谁领风骚

    导言 「TcaplusDB给我们的业务帮了很大的忙」,每当从客户口中听到类似的话语,我们总是很开心.这不仅是因为TcaplusDB的目标就是以客户服务理念为中心,为客户解决问题,同时,这简简单单几个字 ...

  8. 腾讯云TcaplusDB X 大主宰·大千世界|万道争锋,独领其风

    导言 「TcaplusDB给我们的业务帮了很大的忙」,每当从客户口中听到类似的话语,我们总是很开心.这不仅是因为TcaplusDB的目标就是以客户服务理念为中心,为客户解决问题,同时,这简简单单几个字 ...

  9. mysql死锁场景汇总整理

    目录 简述 行锁导致死锁 gap lock/next keys lock导致死锁 index merge导致死锁 唯一索引冲突导致死锁 总结 简述 本文死锁场景皆为工作中遇到(或同事遇到)并解决的死锁 ...

最新文章

  1. grpc通信原理_容器原理架构详解(全)
  2. mixin network_基于Mixin Network的PHP比特币开发教程: 机器人接受比特币并立即退还用户...
  3. Webform DropDownList控件绑定数据源
  4. NLTK频率分类中定义的函数
  5. iOS 二叉树相关算法实现
  6. java isequal_Java LocalDate isEqual()用法及代码示例
  7. 接收字节流_Java中的IO流之输入流|乐字节
  8. 微服务笔记(二) 服务发现
  9. 给博客园添加live2d看板娘(转)
  10. CAD转图片,怎么转换成PNG图片?
  11. Centos 7 开机提示 Entering emergency mode 解决方法
  12. qt添加蒙版代码(子窗口位置)
  13. “海青杯”复赛群雄逐鹿,凡科为青年创业翱翔插上翅膀
  14. 3G iPhone “白苹果”历险记
  15. 英语作文框架(四级)
  16. WPS、Excel对大量数据进行统计公式计算
  17. ReID中PCB模型输出维度_搞定PCB信号完整性,只需9步!都可以学会
  18. 有符号整数除以无符号整数会发生什么??!!!
  19. python去复杂的水印_两种Python基于OpenCV的固定位置半透明水印去除方案
  20. Android 源码结构分析

热门文章

  1. 解决谷歌chrome浏览器主页被强制篡改2345、桔梗网、360导航的问题。
  2. 学生网页作业商城网站设计——男女装商城-功能齐全(40页) HTML+CSS+JavaScript 大学生网店作品 商城网页设计作业模板 学生网页制作源代码下载
  3. 计算机专业ps,计算机专业PS范文
  4. 申请计算机的ps,美国研究生申请材料 计算机PS范文参考
  5. html纵向下拉菜单怎么做,HTML+CSS实现下拉菜单的实现
  6. Feign简介与简单应用
  7. 两万字详解Java异常,面试再也不怕被问到
  8. 机械硬盘每十秒左右“咔哒”响一声是怎么回事?
  9. arima 数据预处理_基于R语言的ARIMA模型
  10. 【打卡帖】7日玩转ESP32——(第2日) GPIO输入,按键的长按和短按