天蚕土豆场景复现

一、场景抽象

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

二、“神兽之原”实现

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

随机生成代码如下:

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. HarmonyOS 查看本地API
  2. WPF DataGridRow Event
  3. 山东工商学院计算机科学与技术分数线,山东工商学院计算机科学与技术专业2016年在山东理科高考录取最低分数线...
  4. 结对编程前对队友程序的分析与对比总结
  5. python登录接口代码_(转载)Python 的 OAuth 登录接口 python-oauth2
  6. Go语言学习教程:xorm表基本操作及高级操作
  7. OpenGL学习(二)第一个OpenGL程序,绘制三角形
  8. 学python能做什么-学了Python都能干什么,哪个最赚钱?
  9. 文件的长度,跟FileReader读到的长度,不一样
  10. html添加变量参数吗,动态CSS与变量参数? (可能吗?)
  11. Class字节码文件结构总结
  12. 使用Gson解析json
  13. Unity视频组件Video Player的介绍
  14. doc 问卷调查模板表_调查问卷范文调查问卷模板.doc
  15. linux ss服务器,【ss】Linux上ss命令的安装与使用
  16. 使用Grafana搭建监控系统
  17. vue制作导航栏html,Vue实现导航栏菜单
  18. Doris export任务概率性cancelled
  19. GB18030全汉字表
  20. react中render重绘时,constructor是否执行问题

热门文章

  1. 分享112个HTML动植食物模板,总有一款适合您
  2. 分分钟搞定Grafana(图文详解)
  3. 满屏飞舞的心HTML动画,使用snowfall.jquery.js实现爱心满屏飞的效果
  4. Blockly Games
  5. 【1.12】件件有着落 事事有回音 万事皆有原因
  6. 换服务器系统怎么迁移,换云服务器系统迁移
  7. 职工管理系统 (含文件)
  8. ML: 使用 VotingClassifier 对股票预测
  9. linux下解压tar zip tgz
  10. 按钮闪光特效并且定时左右晃动