上一节我们简单的实现了第一人称的移动,但是只是让枪有了漫游的效果,本章来实现它的物理效果。

1 先给枪添加一个碰撞器组件,为了简单我们添加一个box collider来模拟碰撞

调整下碰撞器大小,将它设置成如下的长方体,我们来模拟下人物的碰撞。

由于场景是自带碰撞器的所以我们不用给场景添加碰撞器组件。

然后给你的 “人物”(这个碰撞器所挂载的空物体我将它叫做人物)添加一个刚体。

我们此时运行跑一下发现确实穿不了墙了,但是人物会被碰撞后左右上下乱滚,怎么解决呢。

我首先将刚体组件的Constraints下的碰撞效果的旋转全部取消 就不会晕了,如下图

由于人物被碰撞后移动的位置很小并且我们的习惯是一直摁着前进键去撞墙,所以物体被碰撞后的position不用过多考虑。

运行一下发现有点意思 了哦。

但是还有一个 小bug就是人物看向天前进会上天,这不是我们想要的,所以人物移动的脚本需要修改一下。

写代码前先想一想如何实现,我们想让人物看向天的时候沿着自身z轴移动的向量在世界坐标的xz轴平面的投影移动;

unity在Vector3中封装的有向量在面上的投影,我们将代码改动下  代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
///
///</summary>
public class MovePlayer : MonoBehaviour
{//键盘左右移动private float Horizontal;//键盘上下键移动private float Vertical;//z轴移动在xz平面的投影向量private Vector3 LocalZonXZPlane;//x轴移动的向量private Vector3 LocalX;//鼠标x轴移动(相对屏幕而言)private  float MouseX;//鼠标y轴移动(相对屏幕而言)   注:屏幕没有z轴所以没有鼠标z轴移动的inputprivate float MouseY;//移动速度public float moveSpeed = 10;//旋转速度public float rotateSpeed = 50;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//键盘的ad键和←→键左右移动    左:-1    右:1Horizontal=Input.GetAxis("Horizontal");//键盘的ws键和↑↓键上下移动Vertical= Input.GetAxis("Vertical");//鼠标移动来控制旋转MouseX = Input.GetAxis("Mouse X");MouseY = Input.GetAxis("Mouse Y");//*****************************原代码**************************************//移动  键盘ad键相对于三维坐标系的x轴,ws相对于z轴//this.transform.Translate(Horizontal * Time.deltaTime*moveSpeed,0, Vertical * Time.deltaTime * moveSpeed);//*****************************原代码**************************************//获取物体z轴在世界坐标的xz平面的投影LocalZonXZPlane = Vector3.ProjectOnPlane(transform.forward.normalized  *Vertical* Time.deltaTime * moveSpeed,Vector3.up);//获取x轴需要移动的向量LocalX = transform.right * Horizontal * Time.deltaTime * moveSpeed;//使用人物的世界坐标进行移动this.transform.Translate(LocalZonXZPlane + LocalX, Space.World);//旋转 鼠标的左右移相对于三位坐标的沿y轴旋转,鼠标的上下相对于沿着x轴旋转(注意鼠标向上是一个正值但是旋转是逆时针旋转所以x轴旋转要旋转负方向)  //y轴要沿着世界坐标this.transform.Rotate(0* Time.deltaTime, MouseX*rotateSpeed*Time.deltaTime, 0,Space.World);//x轴要沿着自身this.transform.Rotate(-MouseY * rotateSpeed * Time.deltaTime, 0, 0);}}

上面代码每一行我都加注释了  认真读会读懂的,我对上面的代码中比较难理解的地方我说明一下

关于人物移动

//获取物体z轴在世界坐标的xz平面的投影
        LocalZonXZPlane = Vector3.ProjectOnPlane(transform.forward.normalized  *Vertical* Time.deltaTime * moveSpeed,Vector3.up);
        //获取x轴需要移动的向量
       LocalX = transform.right * Horizontal * Time.deltaTime * moveSpeed;
        //使用人物的世界坐标进行移动
   this.transform.Translate(LocalZonXZPlane + LocalX, Space.World);

因为我们不需要人物抬头的时候沿着自身z轴移动,也就是所谓的上天。所以我们只能沿着世界坐标移动,关键是移动的位置怎们确定,我们用包人物在自身z轴的移动向量投影到世界的xz平面上,然后用世界坐标系进行移动,因为人物自身的x轴不会朝天所以不用投影变换。

unity3d实现第一人称射击游戏之CS反恐精英(二)(人物的移动和场景的碰撞关系)相关推荐

  1. unity3d实现第一人称射击游戏之CS反恐精英(一)(第一人称移动)

    学习unity有一段时间了,自己准备做一个cs的项目来巩固并且提升自己. 第一步:搭建场景 因为这个游戏只针对游戏逻辑为重点,所以搭建场景和人物素材我都从unity asset store中的免费资源 ...

  2. unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)

    实现思想 由于子弹的速度非常快,直接让子弹像现实中那样移动很容易发生'穿模'现象,所以我们用unity中的射线来实现,当用户点击鼠标左键的时候,播放开枪动画,火花特效,开火音效,枪口发射一条射线,检测 ...

  3. unity3d实现第一人称射击游戏之CS反恐精英(六)(朝准星位置发射子弹,更换弹夹 )

    上一节将UI简单的布置了一下,下面来实现UI中当前子弹数和总子弹数和脚本的数据绑定,并且发射子弹要朝着准星的位置发射 1:子弹和显示UI的子弹数的实现思路:在枪攻击的脚本里添加当前子弹数和背包子弹数两 ...

  4. unity3d实现第一人称射击游戏之CS反恐精英(三)(人物旋转限制和跳跃功能(消除连跳,碰撞消除,高度稳定))

    1旋转限制 上文实现的代码,我们的人物可以后空翻和前空翻,这不是我们想要的,所以我们需要对视角进行限定. 先分析一下,人物抬头不能让他超过某个角度,也就是抬头的时候我们人物的z轴和世界的y轴的夹角不能 ...

  5. unity3d实现第一人称射击游戏之CS反恐精英(五)(第一视角UI搭建,血量,金钱,子弹,准心,倒计时)

    这一节内容比较简单,就是构建UI在摄像机屏幕上,让玩家可以看到人物的状态,血量,防弹衣,倒计时,金钱,子弹,准心 下面看一下效果图 最终效果是这样的,所有的布局全是用UGUI的TEXT组件添加的,需要 ...

  6. 【转】HTML5第一人称射击游戏发布

    [CSON原创]HTML5第一人称射击游戏发布 功能说明: 游戏中在躲避敌人攻击的同时,需要收集三种不同的钥匙,开启对应的门,最后到达目的地. 该游戏同样基于自己开发的HTML5游戏框架cnGameJ ...

  7. Unity3D FPS Game:第一人称射击游戏(一)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  8. Unity3D FPS Game:第一人称射击游戏(二)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  9. Unity3D FPS Game:第一人称射击游戏(三)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

最新文章

  1. c语言课程设计学生籍贯信息记录簿,C语言课程设计 学生籍贯信息记录簿设计.doc...
  2. 给小孩发布一个有趣的网站 在线动物园
  3. 当当CEO俞渝开撕老公李国庆:同性恋,梅毒,夫妻反目!
  4. 使用Android拍照程序报setParameters failed错误
  5. 武鸣高中2021高考成绩查询,2019年广西两大重点高中成绩大比拼
  6. HashMap,LinkHashMap和TreeMap的区别
  7. IntelliJ IDEA使用(一)基本设置与类、方法模板设置
  8. Java中不可或缺的59个小技巧,贼好用!
  9. NOI数据结构:树套树
  10. Ivan and Burgers(CF-1100F)
  11. 用集合return多个值_十五个常用的 Laravel 集合(Collection)
  12. C# dll加载,抽象方法的使用
  13. Flex in a Week系列视频教程中文版发布
  14. 公共云存储服务的可扩展性和性能
  15. 凸二次规划的解法(旋转算法)
  16. 闲话目前游戏服务器的开发
  17. 数据分析统计工具有哪些?
  18. 【故障处理】ORA-12162 错误的处理
  19. 数据迁移方案-云迁移
  20. Python爬虫实例--新浪热搜榜[xpath语法]

热门文章

  1. Linux使用mutt发送邮件
  2. linux下进程间管道通信,Linux下进程间通信方式-管道
  3. ZCU102制作PYNQ v2.7镜像
  4. pytorch list转tensor_PyTorch入门视频笔记从数组、列表对象中创建Tensor
  5. CAD安装未完成,某些产品无法安装。Autodesk licensing未安装(错误代码:70)
  6. python并发框架 gevent_python并发编程之gevent协程(四)
  7. 喜马拉雅是好公司,但知识付费不是好生意?
  8. c语言学习比较好的几本书
  9. Meta Learning 元学习
  10. 设计模式 - 责任链模式