unity 项目仿cs知识点

2023-11-06

一、简介
1、人物部分
a、人物移动
b、镜头旋转
c、玩家开枪:动画、音频、枚举、弹孔、倍镜
2、敌人部分
a、敌人克隆
b、走向玩家:距离,方向、朝向、点乘、叉乘

二、人物部分
(1)、人物移动

 CharacterController c;//角色控制器
    Vector3 moveDirection = Vector3.zero;//移动方向
    float moveSpeed = 6, jumpSpeed = 4;
    float gravity = 20;
    void Start()
    {
        c = GetComponent<CharacterController>();
    }
    void Update()
    {
        if (c.isGrounded)
        {
            float h = Input.GetAxis("Horizontal");
            float v = Input.GetAxis("Vertical");
            //固定坐标的前后左右移动
            //direction = new Vector3(h, 0, v);
            //第一人称移动,normalized表示长度1
            moveDirection = (transform.right * h + transform.forward * v).normalized;
            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }
        //一直有一个重力加速度
        moveDirection.y -= gravity * Time.deltaTime;
        c.Move(moveDirection * moveSpeed * Time.deltaTime);
    }

谈谈Move和SimpleMove
1、SimpleMove
SimpleMove 只能在平面移动,不带Y轴移动
移动自带速度。所以不需要乘以Time.deltaTime
移动时自带重力
2、Move
移动方向没有限制
移动时候需要乘以Time.deltaTime
需要自己做重力

在(1)中单有第一人称移动的代码还不行,还需要通过鼠标控制人物方向,才能体现为第一人称移动。

(2)、镜头旋转(人物面向方向,脚本挂在人物上)

Vector3 cameraRotate;
	float rotateSpeed = 3f;
	void Update () {
		//获取鼠标水平和竖直方向的偏移量
		float x = Input.GetAxis("Mouse X");
		float y = Input.GetAxis("Mouse Y");
		//左右旋转(绕Y轴旋转);
		cameraRotate.x -= y * rotateSpeed;
		//抬头低头(绕X轴旋转)
		cameraRotate.y += x * rotateSpeed;
		//抬头低头范围
		cameraRotate.x = Mathf.Clamp(cameraRotate.x, -45, 45);
		//左右旋转范围(CS人物是可以左右无限制旋转的,所以这里可以去掉)
		//cameraRotate.y = Mathf.Clamp(cameraRotate.x,-90,90);
		transform.rotation = Quaternion.Euler(cameraRotate.x, cameraRotate.y, 0);
	}

为了更好的移动,可以试着鼠标隐藏

Cursor.lockState = CursorLockMode.Locked;

(3)、玩家开枪

 Transform pos;//枪口位置
    private GameObject explosionFx;//爆炸特效
    private AudioClip explosionAudios, fireAudios;//爆炸音频,开枪音频
    void Start()
    {
        //动态加载资源(路径: Assets/Resources/Prefabs/HitBlood)
        explosionFx = Resources.Load<GameObject>("Prefabs/HitBlood");
        explosionAudios = Resources.Load<AudioClip>("Audios/boom");
        fireAudios = Resources.Load<AudioClip>("Audios/shoot");
    }
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            //点击左键,枪口位置发出开枪音频(自动消失)音量1
            AudioSource.PlayClipAtPoint(fireAudios, pos.position, 1f);
            RaycastHit hit;//碰撞信息
            //检测射线(枪口位置,人物向前方向,碰撞信息,距离20米)
            if (Physics.Raycast(pos.position, transform.forward, out hit, 20))
            {
                GameObject go = Instantiate(explosionFx, hit.point, Quaternion.identity);
                Destroy(go, 1f);
                //播放爆炸特效(自动消失),音量1
                AudioSource.PlayClipAtPoint(explosionAudios, hit.point, 1f);
                Destroy(hit.collider.gameObject);
            }
        }
    }

注意:
(a)、cs应该用射线发射,由于要实现倍镜(我没法用准星对齐),最后我选择用摄像机中心发射,而非枪口发射
在这里插入图片描述
(b)、开枪时需要有开枪动画
在这里插入图片描述

//方法:
Animation an;//动画
void Start()
{
  an.GetComponent<Animation>();
}
//an.play("动画名");
an.play("Fire2");

©、音频

public class ResManage
{
    //该类的目的是为了存储字符串,简洁其他类
    //声音路径
    public const string walk = "Sounds/playWalk";//走路声音
    public const string run = "Sounds/playRun";//跑步声音
}
 AudioClip landClip, runClip;//音频片段
 AudioSource audios;//音频组件
 void Start()
 {
  //音频资源
   audios = GetComponent<AudioSource>();
   //动态加载资源,(体现ResManage类的目的)
   landClip = Resources.Load<AudioClip>(ResManage.walk);
   runClip = Resources.Load<AudioClip>(ResManage.run);
 } 

在这里插入图片描述
(d)枚举的应用
播放动画时,通常都是用枚举来写(此处写敌人的动画)
在这里插入图片描述

在这里插入图片描述

 enum States
    {
        Idle,
        Run,
        Death,
        Attack
    };
    void GetStates(States s)
    {
        switch (s)
        {
            case States.Idle:
                an.Play(ResManage.nurseIdle);
                break;
            case States.Run:
                an.Play(ResManage.nurseRun);
                break;
            case States.Death:
                an.Play(ResManage.nurseDeath);
                break;
            case States.Attack:
                an.Play(ResManage.nurseAttack);
                break;
            default:
                break;
        }
    }

用法:GetStates(States.Idle);
(e)、弹孔位置

if (Physics.Raycast(ray, out hit, 100))//摄像机发射
 {
  if (hit.collider.CompareTag("Plane"))
   {
    //子弹打洞
    //打到地板克隆弹孔
    GameObject go = Instantiate(holeEffect, hit.point, holeEffect.transform.rotation);
    //让弹孔与射线碰撞体的法线垂直(让弹孔总是贴在碰撞体表面)
    go.transform.LookAt(hit.point - hit.normal);
    //让弹孔与碰撞体表面保持0.03距离(这里看着合适就行)
    go.transform.Translate(Vector3.back * 0.03f);
    Destroy(go, 1f);
   }
  }

(f)、倍镜(减表示放大倍数)
camera.GetComponent().fieldOfView-=45;
三、敌人部分
(1)、克隆敌人
(以某点(x1,y1,z1)为圆心范围1~5米生成5个敌人)

for (int i = 0; i < 5; i++)
  {
    float a = Random.Range(1, 5);
    //从原点坐标获取任意一个方向的向量
    Vector2 b = Random.insideUnitCircle;
    //获取向量的单位向量
    Vector2 c = b.normalized;
    //得到位置
    Vector3 d = new Vector3(x1 + c.x * a, y1, z1 + c.y * a);
    Instantiate(enemy, d, transform.rotation);
  }

(2)、敌人走向玩家
距离问题:
利用Vector.Distance(敌人位置,玩家位置);判断距离从而进行播放动画朝玩家靠近。

if (Vector3.Distance(transform.position, player.transform.position) <= 10)

方向问题:

//敌人指向玩家方向
dir = (player.transform.position - transform.position).normalized;

朝向问题:

transform.LookAt(player.transform.position);

(3)、判断敌人位置
a、点乘
在这里插入图片描述

//点乘
float a = Vector3.Dot(transform.forward, enemy.transform.position - player.transform.position);
if (a <= 0)
 {
  tipWarn.text = "警告:后方发现敌人";
 }
else
 {
   tipWarn.text = "警告:前方发现敌人";
 }

b、叉乘
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity 项目仿cs知识点 的相关文章

  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • 正则表达式替换多个相同的连续字符串为一个字符串

    要替换的字符串 http localhost 9010 asqmasqm manage user 需要替换多个连续asqm为一个asqm 正则表达式 asqm 1 g 1 替换结果为 http localhost 9010 asqm man
  • Fedora 17 安装 ACE6.1

    下载 下载地址 http download dre vanderbilt edu 下载ACE 6 1 0 tar bz2 这个软件包只包含ACE 不包含TAO等附加的东西 另外bz2压缩格式的源码包比较小 只有7 55M 解压 mkdir
  • 若依 vue webpack 打包 tomcat部署 刷新404 问题处理思路

    1 参考若依官网中的添加WEB INF方法 若依文档说明 2 检查 vue config js中的生产环境配置 检查publicPath中的路由地址是否为tomcat中的前端路径 例如tomcat 的访问路径是localhost 8080
  • wpsppt设置页码和总页数_wps的ppt页码怎么设置

    wps的ppt页码怎么设置 PPT中如何设置页码那 你知道吗 下面是小编为大家推荐wps的ppt页码设置的内容 希望能够帮助到你 欢迎大家的阅读参考 设置步骤 新建一个PPT 选择 离子 模板 然后猛敲回车 插入多张PPT页面 点击 插入
  • SpringBoot 添加对JSP的支持(附常见坑点)

    序言 SpringBoot默认不支持JSP 如果想在项目中使用 需要进行相关初始化工作 为了方便大家更好的开发 本案例可直接作为JSP开发的脚手架工程 SpringBoot War JSP 常见问题 1 修改JSP需重启才能生效 在生产环境
  • Pycharm 使用pip安装包时候报错 no such option --build-dir

    Pycharm 使用pip安装包时候报错 no such option build dir 原因 pip版本过高 解决办法 对pip降级 等待pycharm更新即可 打开命令行 找到python所在的位置 输入 pip install pi
  • Qt中调用C#制作的com组件

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 前言 这里记录一下在 Qt 64位程序中调用 C 制作的 com 组件的流程 方便后期自己回顾 1 了解 TLB 格式 拿到的依赖库最重要的有一
  • c++四舍五入函数,向上取整,向下取整函数

    对含有小数点的数进行四舍五入是比较普遍的一种需求 在C 中也有类似的取整函数 在C 的头文件中有floor 和ceil 函数 在STL中还有round 函数 向下取整 floor 向上取整ceil 四舍五入取整round
  • 计算机需要解决的基本问题是,【基本计算机问题】计算机不是遇到非常严重的问题,请看这里解答...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 5 启动计算机时出现 Invalid Boot ini 无效 Boot ini 或 Windows could not start Windows 无法启动 错误信息 Invalid Boot
  • 【C++】可变参数模板

    2023年9月9日 周六下午 这个还是挺难学的 我学了好几天 在这里我会举大量的示例程序 这样可以有一个更好的理解 不定期更新 目录 推荐文章 示例程序一 拼接字符串 示例程序二 求整数和 示例程序三 输出一串整数 推荐文章 这里有一些不错
  • [蓝桥杯][2017年第八届真题]分巧克力 二分查找 c语言

    题目描述 儿童节那天有K位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有N块巧克力 其中第i块是Hi x Wi的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们 切出的巧克力需要满足
  • 数据结构-二分搜索树转双向链表(Java)

    二分搜索树转双向链表 牛客JZ36 题目 思路 1 对二分搜索树进行中序遍历 2 将二分搜索树左节点和根节点相连接 右节点和根节点相连接 遍历左子树 连接 左子树尾部不为空 leftTail right pRootOfTree pRootO
  • 求字符相似度的广度优先搜索问题请教

    有n名选手在玩游戏 他们每个人有一个字符 每个字符都有自己固定的若干个特征 特征的种类数为k 每个人的特征为特征总集的一个子集 两个字符的相似度定义为 如果两个字符A和B同时拥有某个特征或者同时没有某个特征 它们的相似度加一 蒜头君想创造出
  • 区块链三加一:去中心化的分布式记账系统

    区块链分布式账本技术的发展有利于人们掌控个人信息 并通过不变的记录保存服务或产品交易 减少对集中系统的依赖 而这场革命正在创造一个去中心化的可信环境 从而颠覆传统业务 区块链技术的核心是分布式记账 去中心化 不容易篡改 比特币等数字货币是区
  • 【PTA】【C语言】判断给定整数是否素数[加强版]

    素数是指在大于1的自然数中 除了1和它本身以外 不能被其他自然数整除的数 本题要求编写程序 判断从键盘输入的数是否素数 如果是素数 输出XX is prime number 的信息 输出XX is not prime number 的信息
  • jquery 取值 radio 问题

    1 获取选中值 三种方法都可以 input radio checked val input type radio checked val input name rd checked val 2 设置第一个Radio为选中值 input ra
  • android 文字高斯模糊,android高斯模糊

    高斯模糊 param context param sentBitmap param radius 0 lt radius lt 25 return SuppressLint NewApi public static Bitmap fastB
  • 【HUAWEI】PPP&PPPoE配合Radius认证配置案例

    背景 对于在一个大的园区网 要保证接入的安全性和合法性 有许多种手段 对于到端的接入用户 可以使用802 1X 对于移动办公人员 可以使用SSL 可以配合使用IPS 防火墙 上网行为管理等手段 不过 对于网关分布的网络呢 或者说 公司合并
  • 如何替代即将淘汰的Flash方案?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由MarsBoy发表于云 社区专栏 导语 Web技术飞速发展的如今 我们在感受新技术带来的便捷和喜悦的同时 也时常在考虑着一个问题 老技术如何迁移 正如本文的主题一样 Flash
  • unity 项目仿cs知识点

    一 简介 1 人物部分 a 人物移动 b 镜头旋转 c 玩家开枪 动画 音频 枚举 弹孔 倍镜 2 敌人部分 a 敌人克隆 b 走向玩家 距离 方向 朝向 点乘 叉乘 二 人物部分 1 人物移动 CharacterController c