unity,射手游戏
Posted 忽然602
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity,射手游戏相关的知识,希望对你有一定的参考价值。
文章目录
- 介绍
- 一,制作玩家具体函数脚本PlayerCharacter
- 三、 制作玩家控制脚本 PlayerController,调用上面的函数方法
- 四、 制作子弹脚本 shell
- 五、 给玩家挂载脚本
- 六、 制作坦克脚本
- 七、 给坦克添加组件
- 八、 开始游戏,播放动画
- 九、 下载
介绍
3d游戏。
玩家自由移动。
持枪发射子弹。
随机生成的坦克追踪玩家。
坦克发射子弹攻击玩家。
hp归零死亡
一,制作玩家具体函数脚本PlayerCharacter
设置float:移动速度、转动速度、子弹发射速度、现在生命值、最大生命值、两次攻击时间间隔。
设置bool:是否正在攻击、是否死亡
其他组件:角色控制器、生命值滑动条、最大生命值颜色(绿色)、最小生命值颜色(红色)、音频源、动画器、粒子系统
等
public float speed;
public float turnSpeed;
public float health;
public float attackTime;
public float health;
float healthMax;
bool isAlive;
bool attacking = false;
CharacterController cc;
Animator animator;
public Slider healthSlider;
public Image healthFillImage;
public Color healthColorFull = Color.green;
public Color HealthColorNull = Color.red;
public ParticleSystem explosionParticles;
public Rigidbody shell;
public Transform muzzle;
start方法,获取动画器、角色控制器、生命值最大化、bool设置活着、更新血条滑块、死亡爆炸效果设置为不可见。
animator = GetComponentInChildren<Animator>();
cc = GetComponent<CharacterController>();
healthMax = health;
isAlive = true;
RefreshHealthHUD();
explosionParticles.gameObject.SetActive(false);
玩家被攻击,生命值减少amount,更新血条,如果生命值小于零,死亡
public void TakeDamage(float amount)
health -= amount;
RefreshHealthHUD();
if (health <= 0f && isAlive)
Death();
更新血条,滑块的value值更新一次,血条由100%的绿色,变成百分之(health / healthMax)的绿色。
public void RefreshHealthHUD()
healthSlider.value = health;
healthFillImage.color = Color.Lerp(HealthColorNull, healthColorFull, health / healthMax);
死亡,角色是否活着设置为否,播放粒子特效,当粒子系统的持续时间结束后,粒子系统对象就会被销毁,设置玩家为不可见。
public void Death()
isAlive = false;
explosionParticles.transform.parent = null;
explosionParticles.gameObject.SetActive(true);
ParticleSystem.MainModule mainModule = explosionParticles.main;
Destroy(explosionParticles.gameObject, mainModule.duration);
gameObject.SetActive(false);
角色移动,传入一个向量值,必须在活着、没有攻击才能移动。
角色控制器使用simplemove函数,移动的时候,控制“speed”动画,开始播放
public void Move(Vector3 v)
if (!isAlive) return;
if (attacking) return;
Vector3 movement = v * speed;
cc.SimpleMove(movement);
if(animator)
animator.SetFloat("Speed", cc.velocity.magnitude);
人物旋转函数,玩家往哪里跑,角色人物头就转向哪里
设置目标位置、当前位置
四元数转向
使用球面插值,平滑转动
public void Rotate(Vector3 lookDir)
var targetPos = transform.position + lookDir;
var characterPos = transform.position;
//去除Y轴影响
characterPos.y = 0;
targetPos.y = 0;
//角色面朝目标的向量
Vector3 faceToDir = targetPos - characterPos;
//角色面朝目标方向的四元数
Quaternion faceToQuat = Quaternion.LookRotation(faceToDir);
//球面插值
Quaternion slerp = Quaternion.Slerp(transform.rotation, faceToQuat, turnSpeed * Time.deltaTime);
transform.rotation = slerp;
开火脚本
必须活着、不正在开火才能调用
生成一个子弹刚体,玩家自身位置,枪口方向转向,设置发射速度
播放开火音效
动画器播放开火动作
延迟attachtime发射一次,设置发射频率
public void Fire()
if (!isAlive) return;
if (attacking) return;
Rigidbody shellInstance = Instantiate(shell, muzzle.position, muzzle.rotation) as Rigidbody;
shellInstance.velocity = launchForce * muzzle.forward;
shootAudiosource.Play();
if(animator)
animator.SetTrigger("Attack");
attacking = true;
Invoke("RefreshAttack", attackTime);
发射时间间隔脚本,时间未到,不能发射
void RefreshAttack()
attacking = false;
三、 制作玩家控制脚本 PlayerController,调用上面的函数方法
start方法获取角色控制器
void Start ()
character = GetComponent<PlayerCharacter>();
固定帧数刷新。
鼠标左键调用点击开火函数
键盘wsad控制人物移动
人物移动的方向和人物转向的方向保持一致
void FixedUpdate()
if (Input.GetButtonDown("Fire1"))
character.Fire();
var h = Input.GetAxis("Horizontal");
var v = Input.GetAxis("Vertical");
character.Move(new Vector3(h, 0, v));
var lookDir = Vector3.forward * v + Vector3.right * h;
if (lookDir.magnitude != 0)
character.Rotate(lookDir);
四、 制作子弹脚本 shell
设置float参数:子弹生存时间、爆炸半径、爆炸力量、最大伤害
设置bool参数:子弹是否正在旋转
设置其他:音频源、层级、粒子系统
public float lifeTimeMax = 2f;
public AudioSource explosionAudioSource;
public ParticleSystem explosionParticles;
public float explosionRadius;
public float explosionForce = 1000f;
public float damageMax = 100f;
public LayerMask damageMask;
public bool isRotate = false;
start方法,添加扭矩,模拟子弹旋转
void Start ()
if(isRotate)
GetComponent<Rigidbody>().AddTorque(transform.right * 1000);
触发器碰撞检测
在当前游戏对象的位置上创建一个球形的检测区域,并检测该区域内是否有与指定层级(damageMask)匹配的碰撞器(colliders)。如果有,则返回一个碰撞器数组(Collider[]),其中包含了所有与当前游戏对象在指定半径(explosionRadius)内发生碰撞的游戏对象的碰撞器。通常用于实现爆炸伤害、碰撞检测等功能。
遍历数组,计算伤害
播放粒子特效
private void OnTriggerEnter(Collider other)
Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius, damageMask);
foreach(var collider in colliders)
var targetCharacter = collider.GetComponent<PlayerCharacter>();
if (targetCharacter)
targetCharacter.TakeDamage(CalculateDamage(collider.transform.position));
explosionParticles.transform.parent = null;
explosionAudioSource.Play();
explosionParticles.Play();
ParticleSystem.MainModule mainModule = explosionParticles.main;
// Destroy(explosionParticles.gameObject, mainModule.duration);
Destroy(gameObject);
计算伤害,传入向量值
距离越小,伤害比例越大
设置最低伤害Mathf.Max()函数,最低伤害为2
float CalculateDamage(Vector3 targetPosition)
var distance = (targetPosition - transform.position).magnitude;
//距离越小,伤害比例越大
var damageModify = (explosionRadius - distance) / explosionRadius;
var damage = damageModify * damageMax;
return Mathf.Max(2f, damage);
五、 给玩家挂载脚本
设置参数,添加预制体子弹
六、 制作坦克脚本
设置导航网格、play对象
NavMeshAgent agent;
PlayerCharacter character;
Transform targetTrans;
start函数,获取玩家实例,
导航网格寻找玩家
延迟1秒后,每隔三秒发射一次子弹
void Start ()
character = GetComponent<PlayerCharacter>();
agent = GetComponent<NavMeshAgent>();
targetTrans = GameObject.FindGameObjectWithTag("Player").transform;
InvokeRepeating("FireControl", 1, 3);
开火控制函数,调用共同使用的fire()方法。
void FireControl()
character.Fire();
update()函数,不断追踪玩家的位置,
转向玩家
void Update ()
agent.destination = targetTrans.position;
transform.LookAt(targetTrans);
七、 给坦克添加组件
八、 开始游戏,播放动画
人物移动、坦克移动
九、 下载
https://pan.baidu.com/s/1RVemZY_THhhpD0v_IcQS2w
提取码:tdq9
+
Unity 框架QFramework v1.0 使用指南 架构篇:20. QFramework.cs 的更多内容 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏
终于把想介绍的内容都讲完了。
如果想进一步了解和学习 QFramework.cs 可以看如下内容。
使用 QFramework.cs 的案例与项目
更多的案例可以到 QFramework github 主页查看。
地址:
- github: https://github.com/liangxiegame/QFramework
- gitee: https://gitee.com/liangxiegame/QFramework
国内童鞋建议打开 gitee 版本仓库。
在 Readme 中可以看到如下内容:
在这里可以安装 QFramework.cs 与官方示例。
点击之后,再点击下图中的下载按钮。
就可以下载 QFramework.cs 官方示例了。
示例中,除了本教程包含的 CounterApp,还有很多其他示例,如下:
小游戏《点点点》
小游戏《FlappyBird》
作者:王二 soso https://github.com/so-sos-so
小游戏《Cube Master》
作者:王二 soso https://github.com/so-sos-so
简易关卡编辑器2D
小游戏《贪吃蛇》
作者:一只皮皮虾 https://gitee.com/PantyNeko/
以上的示例都是由 QFramework.cs 制作而成的官方示例。
另外还有群友制作的开源游戏
CrazyCar
Unity制作的联机赛车游戏,后台为SpringBoot + Mybatis;游戏采用QFramework框架,支持KCP和WebSocket网络(商用级)
作者: TastSone https://github.com/TastSong
项目地址: https://github.com/TastSong/CrazyCar
QFramework.cs 的架构如何演化出来的?
QFramework.cs 的架构当前的版本,是从 《框架搭建 决定版》中设计出来的,如果学习这门课程,可以对 QFramework.cs 的原理和理念理解得更深刻,更容易对 QFramework.cs 做修改和定制。
- 《框架搭建 决定版》B 站试听:https://www.bilibili.com/video/BV1wh411U7X6
- 《框架搭建 决定版》完整版
- Unity 官方中文课堂:https://learn.u3d.cn/tutorial/framework_design
- siki 学院:https://www.sikiedu.com/my/course/871
- GamePix 独立游戏学院:https://www.gamepixedu.com/my/course/2
另外 QFramework.Toolkits 和 QFramework.ToolkitsPro 里包含的工具很多都是由 QFramework.cs 设计的, 工具的源码本身也是不错的学习资料。
更多内容
- 转载请注明地址:liangxiegame.com (首发) 微信公众号:凉鞋的笔记
- QFramework 主页:qframework.cn
- QFramework Github 地址: https://github.com/liangxiegame/qframework
- QFramework Gitee 地址:https://gitee.com/liangxiegame/QFramework
- GamePix 独立游戏学院 & Unity 进阶小班地址:https://www.gamepixedu.com/
以上是关于unity,射手游戏的主要内容,如果未能解决你的问题,请参考以下文章