0.写在前面

Survival Shooter是一个持续很久的项目,实际上也是正经进入untiy3d后的第一个正经的游戏,但是学习了很长时间,其中也因为各种原因断过,终于把他做出来了,撒花!那么接下来就写一下做第一个游戏的方方面面叭。

1.环境

首先搭载整个游戏的环境。在进入unity后,首先调直座椅靠背,emmm修改界面布局,当然这个也是可有可无啦,只是看着好看。

建立一个新的场景,命名。扔进scene的文件夹里。

现在就正式开始啦:首先把prefabs里面的environment扔进Hierarchy里面,因为这个本事就是教程,的确给了很多已经做好的东西,very nice,之后可能就需要我们慢慢做了。那么实际上环境里的大部分东西都已经设置好了,唯一一点是,我们的游戏人物需要根据鼠标的位置继续转向和射击,所以要进行的操作是:在环境中添加一个3d object叫Quad。

将我们想要的Quad重命名,一定要记得加入组件后先重命名!优良习惯,更名为Floor然后将Quad修改为我们想要的位置:

Position
x:0 y:0 z:0Rotation
x:90 y:0 z:0

此时此刻我们的Floor已经铺满了整个环境,甚至还多出来了点,但唯一的缺陷就是,Floor是可见的,这是由于它内部的组件Mesh Render带来的。

接下来,去掉Mesh Render这个组件,Floor就只可见它的轮廓了。

那么现在呢,我们希望摄像机发出的光只对我们的Floor有效,所以我们应该将这个Floor和别的层分离开来,所以将他放入Floor层中。

最后,我们的游戏一般来说都是需要背景音乐的,我们在Environment的Inspector里添加组件Audio Source,添加Background Music。注意要去掉play on Awake,选择loop,最后可以修改一下音量,我调到了0.1大小。

环境搭建就完成。

2.角色

1.角色动画 Animator Controller

接下来在Model-Character中把我们的Player扔进Hierarchy。我们的角色自身就携带了三个动画:Move,Idle,Die。但是在游戏中我们需要一个管理员,来对何时调用三个动画进行管理,这个东西叫Animator Controller。我们在Assets底下新建一个文件夹叫Animator,注意,每一个不同的角色可能都需要用不同的AC(Animator Controller)进行管理,除非某几个角色的骨骼,动画类似(比如都是人形双足生物,艾泽拉斯的原生矮人和德拉诺的霜狼氏族)都可以用一套AC进行管理。

在Animator下新建一个叫PlayerAC的Animator Controller。打开它,将Player自带的若干个动画拖进去,就像酱紫:

在做左侧添加AC控制动画的Parameter,当某几个参数确定的时候改变动画。我们在这里添加一个IsWalking的布尔值,当它为true的时候由Idle转到Move,Flase的时候反过来。再添加一个Die的Trigger值,Trigger值和bool值十分类似,不同的地方在于,Trigger一旦改变了值,会立刻改变回来,是一次性一下的。因为我们想达到的效果是玩家一死就立刻重新开始,此时玩家必须是活过来的。

在AC中添加Transitions,点击这些白色的线,在右侧添加parameters,特别注意的一点是,一定要把Has Exit Time的这个勾去掉,否则动画会有一定的延迟。

那么将其他的Transitions添加完,保存。将PlayerAC拖到Player里的Animator Controller中去。

2.物理属性

接下来要给我们的玩家添加一下物理属性,我们希望它像一个正常的人物一样,不会穿墙,被人打得时间太长了就会死等等人民大众喜闻乐见的属性。所以我们添加RigiBody,使我们的人物拥有一般刚体的性质,我们把Drag和Angular Drag调整至无限大,并且在方向上进行约束,使我们的玩家不会倒下去。

接下来添加Capsule Collider,这将会用一个胶囊(emm)包住我们的人物,同时也是给了这个模型一个物理边界,以便进行一些碰撞等动作的判断。

最后还是有音效,如果Player受伤了我们希望他叫一声,所以添加Audio Source,同样的点掉Play on Awake。

3.运动程序

做完了这一切,我们要告诉程序如何进行判断。我们要进行程序段的操作。在Scripts-Player里找到PlayerMoveMent,将他直接拖进Player里,双击打开进行修改。

    public float speed = 6f;Vector3 movement;//3维的向量,存储玩家的移动信息Animator anim;Rigidbody PlayerRigibidy;int floorMask; float camRayLength = 100f;

先看变量声明,speed是角色移动的速度,movement是一个Vector3型的变量,表示3D的向量和点。包含位置、方向(朝向)、欧拉角的信息,也包含做些普通向量运算的函数。用来存储角色的运动信息。接下来生命控制动画的anim,和控制角色运动的playerRigibody。

floorMask需要解释一下,首先需要解释的是,鼠标移动控制角色转动的原理是,我们模拟一个由玩家-鼠标两点确定的一条光线,这条光线打在我们最开始建立的Floor上,确定唯一的一个点,是我们瞄准的方向。所以设置一个floorMask变量,整型,因为所有的LayerMask的存储方式实际上都是以整型的数字进行存储的,每一层一个数字。用这个floorMask来获取我们想要投射的层。

camRayLength就是发出光线的长度。

 void Awake(){floorMask = LayerMask.GetMask("Floor");anim = GetComponent<Animator>();PlayerRigibidy = GetComponent<Rigidbody>();}

下来看Awake函数,这是unity自己调用的函数。是在一开始时进行初始化,首先获取我们要进行投射的层,存储到floorMask里。接下来将我们的变量和unity里的组件进行关联。

void FixedUpdate() //物理更新{float h = Input.GetAxisRaw("Horizontal");//只取-1 0 1float v = Input.GetAxisRaw("Vertical");Move(h, v);Turning();Animating(h, v);}

我们使用的更新方法是FixedUpdate,在官方文档中是这么说的:

This function is called every fixed framerate frame, if the MonoBehaviour is enabled.

也就是固定时间频率进行更新,受游戏帧频率的影响,一般是0.02s一更新(unity本身的FPS是50HZ)。我们定义两个新的变量,一个叫h,用来获取键盘输入的移动指令。此处使用GetAxisRaw而不是GetAxis是因为,GetAxisRaw只能获得三个离散的数据(-1,0,1)。这意味着我们的人物将从静止突然到最大速度,在一个躲避敌人并干死他们的游戏中将提供更大的灵活度。Horizontal和Vertical是unity内部已经定义好的,只对某些按键有效。

最后调用我们下面写的三个方法。

 void Move(float h,float v){movement.Set(h, 0f, v); //设置值movement = movement.normalized * speed * Time.deltaTime;PlayerRigibidy.MovePosition(transform.position + movement);}

Move方法写的是玩家的移动。我们把h,v传进来,用BVector3里面自己带的Set方法进行设置值,这样我们的人物可以在x和z方向进行若干个1的移动。However,我们都学习过又高又妙的数学,如果只这么设置,我们就会在走对角线的时候,每次走1.414的距离,所以要将所有的移动归一化。使用Vector3内部的normalized方法,我们就得到了所有方向的1,再乘以一开始定义的速度。但此时,克苏鲁的诅咒并没有结束,如果我们就这样结束的话,每个0.02s都会更新一次,我们的人物将每秒移动50个距离,这太浮夸了,我们要设置在每个时间片区内只进行一次更新。乘上Time的DeltaTime方法。这才结束。

最后,我们将新计算好的位置,和原本的位置相加,得到新的位置,用Rigibody内的MovePosition进行移动。特别强调的是,我们的移动和移动的动画是两回事,只是在同一时间发生了,但位移是suo的一下的,在这期间进行了动画。

void Turning(){Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit floorHit;if(Physics.Raycast(camRay,out floorHit, camRayLength, floorMask)){Vector3 playerToMouse = floorHit.point - transform.position;playerToMouse.y = 0f;Quaternion newRotation = Quaternion.LookRotation(playerToMouse);PlayerRigibidy.MoveRotation(newRotation);}}

Turning方法是对角色进行旋转。我们之前定义了那个神奇的光线,现在就是要实现这个光线来对角色的移动进行控制。首先定义一个Ray类的变量叫camRay,里面使用Camera的main的方法来制造这一光线。然后我们需要判断,这个光线有没有射到我们想要的面上。在这里定义一个RaycastHit型的变量。如果射到了,即撞击发生了,我们把这个撞击点的位置和当前位置相减取到相对位置,同时我们不希望角色的位置有倾倒,所以我们把y方向置0。但现在我们无法将角度这个概念储存到Vector3类型的变量里去,所以要定义一个新的变量叫Quaternion。用他来存储新的角度。最后使用Rigibody方法进行旋转。

    void Animating(float h, float v){bool walking = h != 0f || v != 0f;anim.SetBool("IsWalking", walking);}

Animating方法用来控制PlayerAC中IsWalking参数的值。当Input没有值传进来的时候,将IsWalking变为false。

最后贴一下总的代码

using UnityEngine;public class PlayerMovement : MonoBehaviour
{public float speed = 6f;Vector3 movement;//3维的向量,存储玩家的移动信息Animator anim;Rigidbody PlayerRigibidy;int floorMask; float camRayLength = 100f;void Awake(){floorMask = LayerMask.GetMask("Floor");anim = GetComponent<Animator>();PlayerRigibidy = GetComponent<Rigidbody>();}void FixedUpdate() //物理更新{float h = Input.GetAxisRaw("Horizontal");//只取-1 0 1float v = Input.GetAxisRaw("Vertical");Move(h, v);Turning();Animating(h, v);}void Move(float h,float v){movement.Set(h, 0f, v); //设置值movement = movement.normalized * speed * Time.deltaTime;PlayerRigibidy.MovePosition(transform.position + movement);}void Turning(){Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit floorHit;if(Physics.Raycast(camRay,out floorHit, camRayLength, floorMask)){Vector3 playerToMouse = floorHit.point - transform.position;playerToMouse.y = 0f;Quaternion newRotation = Quaternion.LookRotation(playerToMouse);PlayerRigibidy.MoveRotation(newRotation);}}void Animating(float h, float v){bool walking = h != 0f || v != 0f;anim.SetBool("IsWalking", walking);}
}

到此为止,基本的角色和环境搭建就算完成。进行游戏可以有基本的移动了,但在转向还存在问题,我们将在下一篇中继续。

unity——Survival Shooter:环境角色相关推荐

  1. unity survival shooter ZSpace

    一.工程准备 1.官网下载支持Unity4.6版本 survival shooter资源: 2.确保你的ZSPACE有最新的SDK install http://developer.zspace.co ...

  2. unity——Survival Shooter:攻击敌人

    8.攻击敌人 现在我们要赋予可爱的小主人公夺取敌人生命的能力. now 我们要做一个炫酷的宇宙无敌螺旋牛逼激光枪.我们的小人物已经在手里拿着枪了,我们需要做的就是让他能射出东西:让他能发出声音:让他能 ...

  3. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码

    Unity官方教程 (Survival Shooter)  资源已经失效了! 可能是版本太老了 中文名叫噩梦射手? 找了半天找了这个版本 的 放到这里吧 [这个游戏主角是必死的,就看能坚持多久啦] 网 ...

  4. Unity3D休闲射击类游戏《Survival Shooter》完整源码

    Unity3D休闲射击类游戏<Survival Shooter>完整源码分享给大家学习,这个对于那些想要制作u3d射击类游戏有很大帮助. 运行环境是:Unity5.3.1 下载地址: ht ...

  5. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  6. unity开发android游戏(一)搭建Unity安卓开发环境

    1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK中,包含JRE) 如果是6 ...

  7. Unity实现第三人称角色转向摄像机朝向的方向

    Unity实现第三人称角色转向摄像机朝向的方向 以黑魂为例,每次按下向前移动的控制键,人物会转向摄像机朝向的方向 void TurnTo(Vector3 direction)//形参填入需要朝向的方向 ...

  8. oculus integration+unity 开发入门——环境配置笔记

    oculus integration+unity 开发入门--环境配置笔记 一.Unity2019安装 二.Android Studio安装 Unity环境配置 一.Unity2019安装 我采用的是 ...

  9. Unity学习-熟悉环境

    Unity引擎基础 Unity环境搭建 C#基础 Unity API 物理引擎1 3D数学基础 UGUI Unity环境 设置 layout–2 by 3 Project – 1 column 面板 ...

最新文章

  1. 集成“PDF预览”和“页面翻译”的亿简浏览器0.5.0 alpha
  2. 笔记-中项案例题-2020年下-风险管理
  3. 韩顺平 java笔记 第16讲 第19讲 数组 二维数组
  4. ubuntu16.04 制作gif
  5. Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决
  6. 分布式架构的王者?Kubernetes凭什么
  7. 疫情之下,哪些行业正在逆势爆发?
  8. Java继承中为什么不可以降低父类重写方法的访问权限
  9. 生长区域算法的php实现
  10. c语言10000以内最大的质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  11. C# Tostring() 格式大全
  12. dojo/dom-class源码学习
  13. 全网首发:明明已安装也存在,报错找不到lualib.h
  14. 1.kafka面试题--ISR相关
  15. 使用 DUET/REFIND 方法将 NVME 添加为引导驱动器
  16. Spring STS 修改启动Java VM
  17. 只有程序员能看懂的西游记
  18. 【复盘】如何打造自己的研发能力
  19. 解决 v-for 出现的 warning:component lists rendered with v-for should have explicit keys
  20. VFP开发微信、支付宝扫码支付

热门文章

  1. 每个程序员都应该阅读的最有影响力的书是什么?
  2. 动力学方程的数值解(动力学方程+行星运动轨道)
  3. QString::fromLocal8Bit()函数
  4. Unity CustomFont (怎么制作图片文字)
  5. iPhone微信卸载后聊天记录恢复,试试这2个方式
  6. orchestrator_配置IBM Cloud Orchestrator以配置到SoftLayer
  7. 股权交易中心+区块链试点将开始
  8. 反射模式python
  9. (0105)iOS开发之iOS13 暗黑模式(Dark Mode)适配
  10. OUTLOOK2021配置QQ邮箱