SurvivalShooter学习笔记(七.玩家射击)
玩家射击:(这个脚本放在玩家的空子物体上,这个位置为枪口位置)
点击鼠标,玩家射击;
射击枪口发光,射击通过射线,方向有激光效果;(关于射线不明白可以参考Unity射线相关)
射击有射击音效
射击有每发伤害,有CD 间隔时间,有射程
敌人射击脚本如下:
1.变量:
射击配置参数:
public int damagePerShot = 20; // 每枪伤害
public float timeBetweenBullets = 0.15f; // 普攻CD时间
public float range = 100f; // 射程
float timer; // 射击计时器,计时上次射击到现在时间
Ray shootRay = new Ray(); // 枪口向前的射线
RaycastHit shootHit; // 射线碰撞
int shootableMask; // 可射击的层:所有可射击的物体都应在这个层
怪物敌人可被玩家的枪射击,所以设置这个层
组件:
枪口粒子特效的Looping和PlayOnAwake当然不勾选,每次射击手动播放
枪口AudioSource拖入枪击声音,Looping和PlayOnAwake当然不勾选,每次射击手动播放
LineRenderer默认禁用,需要时手动启用:设置不同效果通过拖入材质,一般使用Unlit/Color普通Shader
Light默认禁用,需要时手动启用,为射击时枪口向地面和脸的点光源
ParticleSystem gunParticles; // 枪口粒子特效
LineRenderer gunLine; // 激光线
AudioSource gunAudio; // 枪上音效播放器
Light gunLight; // 点光
public Light faceLight; // Duh
float effectsDisplayTime = 0.2f; // 特效显示时间与普攻CD时间的比例
2.初始化组件:
void Awake ()
{
// 设置射线射“Shootable”这个层
shootableMask = LayerMask.GetMask ("Shootable"); gunParticles = GetComponent<ParticleSystem> ();
gunLine = GetComponent <LineRenderer> ();
gunAudio = GetComponent<AudioSource> ();
gunLight = GetComponent<Light> ();
//faceLight = GetComponentInChildren<Light> ();
}
3.Update中判断是否满足攻击的各项条件,满足则射击
这里: 时间超过 射击普攻特效要相对普攻CD要显示的时间 要停止特效显示,特效显示时间要根据射击间隔时间乘以百分比,成功避免了普攻间隔端引起的:下次普攻把上次的特效给关了的情况,这样处理后,每次关都是关本次射击的特效。
void Update ()
{
// 计时器计时从上次攻击到现在时间
timer += Time.deltaTime; //1.鼠标左键按 2.攻击已经CD 3.没有暂停
if(Input.GetButton ("Fire1") && timer >= timeBetweenBullets && Time.timeScale != 0)
{
Shoot (); //射击
} // 时间超过 射击普攻特效要相对普攻CD要显示的时间
if(timer >= timeBetweenBullets * effectsDisplayTime)
{
//禁用特效
DisableEffects ();
}
}
4.禁用特效:
public void DisableEffects ()
{
gunLine.enabled = false;
faceLight.enabled = false;
gunLight.enabled = false;
}
5.射击函数:
void Shoot ()
{
//重置攻击计时器时间,重新开始计时
timer = 0f; // 播放攻击音效
gunAudio.Play (); // 显示光效
gunLight.enabled = true;
faceLight.enabled = true; // 播放枪口粒子特效(避免上次播放未结束,先停止再播放)
gunParticles.Stop ();
gunParticles.Play (); // 启用LinRenderer,起始点设为枪口(这个脚本挂在枪口,所以this就是枪口)
gunLine.enabled = true;
gunLine.SetPosition (0, transform.position); // 设置射击射线,从枪口向前射
shootRay.origin = transform.position;
shootRay.direction = transform.forward; // 射到了可射到的物体
if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
{
// 尝试获取敌人生命脚本
EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
if(enemyHealth != null)
{
// 敌人承受伤害,传入伤害值,和受击点用于播放受击特效
enemyHealth.TakeDamage (damagePerShot, shootHit.point);
}
//设置LineRnderer的终点位置为受击点,即射线击中的点
gunLine.SetPosition (1, shootHit.point);
}
// 没射到可射到的物体
else
{
// 设置LineRenderer的终点为射击方向(即枪口前方)的最大射程处
gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range);
}
}
SurvivalShooter学习笔记(七.玩家射击)的更多相关文章
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
随机推荐
- Editplus 文件中批量搜索字符串的技巧
常规情况下,我们利用Crtl+F可以在文档中查找字符串,进行替换等操作. 但要有的时候,我们要在大量文件中做这种查找操作,显然,一个个的打开文档是不现实的. 比如: 最近,谷歌被墙的很厉害,导致很多w ...
- .NET面试题(一)
1.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? foreach (System.Windows.Forms.Control control in this.Contr ...
- 使用ng-grid实现可配置的表格
使用Angularjs在带来方便的同时,也有一些遗憾:很多基于jquery或其它的组件,在angularjs中需要集成一下才能用得流畅.但是一些比较复杂的组件,集成起来的工作量相当大,比如说grid. ...
- ios的设计原则
ios的设计原则 iOS设计的详细的主要宗旨例如以下: 1.易操作,所关心的主题清新 2.UI控件布局合理,图片质量清新 3.用户的使用习惯 4.字体的大小,主次分明 5.舒适的动画效果 在创建一个新 ...
- OSGI 面向Java的动态模型系统
OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...
- c++ friend 遇到 namespace 无法访问 private 成员的问题
相关的文章(比较有意思,记录一下):http://www.cnblogs.com/lx20030303/archive/2012/09/21/2696258.html 先看例子.如下. 尝试编译的话, ...
- BodyTagSupport小案例1
做了个简单的实验:写一个tag,将tag body中的内容打印成一个三角形 代码很简单就不赘述了,直接贴在下面,值得注意的是这个图(摘自李兴华JAVA开发实战经典) 在做的过程中遇到了如下问题: 1. ...
- java大数模板
java 大数计算 这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3 ...
- iOS开发中如遇到频繁的Http请求,取消之前已经发送的Http
主要精髓在于 第一点:不要initialize a new AFHTTPSessionManager object everytime 一定要把manager用成全局的 第二点:把请求返回的task对 ...
- 公共查询类criteria
package cn.edu.hbcf.common.vo; import java.math.BigDecimal; import java.sql.Timestamp; import java.u ...