Unity导弹,射击
导弹
(由于本鼠鼠是手上没有合适的素材又是美工苦手,就凑合着看吧...)
红色即为导弹,蓝色即为目标
在导弹上挂载钢体组件和碰撞组件
ps:勾选碰撞组件中的is Trigger属性
在目标上挂载碰撞组件
创建C#脚本
代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(Rigidbody2D))]
public class Missile : MonoBehaviour
{public Transform target;public float speed=5f;//导弹的飞行速度public float rotateSpeed=200f;//导弹的转弯速度private Rigidbody2D rigidbody2D;private void Start() {rigidbody2D=GetComponent<Rigidbody2D>();}private void FixedUpdate() {//目标相对于导弹的方向向量Vector2 direction = (Vector2)target.position-rigidbody2D.position;direction.Normalize();float rotateAmount=Vector3.Cross(direction,transform.up).z;//导弹的角速度rigidbody2D.angularVelocity=-rotateAmount*rotateSpeed;//导弹的线速度rigidbody2D.velocity=transform.up*speed;}//导弹命中private void OnTriggerEnter2D(Collider2D target) {Destroy(target.gameObject);Destroy(gameObject);}
}
对于导弹来说,当目标不在其左侧就在其右侧
当所需的旋转的角度越大,叉乘得到的结果向量模长越长(可以通过叉乘所得到向量的Z轴)
Rigidbody2D.angularVelocity:角速度(以度/秒为单位)
rigidbody2D.angularVelocity=-rotateAmount*rotateSpeed;
ps:一定要加负号,否则导弹会被“排斥”,而非跟踪
如图
射击
创建一个炮台
如图所示的双管炮台,蓝色的炮台包括两个子物体,即左右炮管。左右炮管分别包括了一个空物体firePos,用于确定子弹被实例化的位置
创建子弹
为子弹挂载钢体组件和碰撞组件
靶子就沿用上图中的target,但是为其创建一个名为target的新Tag
创建C#脚本,Bullet,Turret,Weapon并挂载至子弹,炮台,两个炮管
代码实现
Weapon
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Weapon : MonoBehaviour
{public Transform firePos;//设置开火位置public GameObject bulletPrefab;//发射的子弹private void Update() {//鼠标左键攻击if(Input.GetMouseButtonDown(0)){Shoot();}}private void Shoot(){//实例化子弹Instantiate(bulletPrefab,firePos.position,firePos.rotation);}
}
Bullet
public class Bullet : MonoBehaviour
{public float speed = 20f;//子弹的速度public Rigidbody2D rb;void Start(){rb.velocity = transform.up*speed;}private void OnTriggerEnter2D(Collider2D target) {//命中后摧毁靶子if(target.tag=="target"){Destroy(target.gameObject);}Destroy(gameObject);}
}
Turret
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Turret : MonoBehaviour
{void Update() { //鼠标在世界坐标的位置Vector2 mousePos=Camera.main.ScreenToWorldPoint(Input.mousePosition);//炮台要指向的方向Vector2 aimPos=mousePos-(Vector2)transform.position.normalized;//将物体自身坐标系的x轴朝向aimPostransform.up=aimPos;}
}
附赠一个简单的激光枪
创建一个LineRenderer
记得调整LineRenderer中Position的值
创建相应的武器
代码实现
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LaserWeapon : MonoBehaviour
{public Transform firePos;public LineRenderer laser;private void Update() {if(Input.GetMouseButtonDown(0)){//启动协程StartCoroutine(Shoot()) ;}}IEnumerator Shoot(){//射线检测RaycastHit2D hit=Physics2D.Raycast(firePos.position,firePos.right,100);if(hit){//射程内有物体(距离<=100)laser.SetPosition(0,firePos.position);laser.SetPosition(1,hit.point);Destroy(hit.collider.gameObject);}else{//射程内没有物体(距离>100)laser.SetPosition(0,firePos.position);laser.SetPosition(1,firePos.position+firePos.right*100);}laser.enabled=true;//激光停留的时间yield return new WaitForSeconds(0.02f);laser.enabled=false;}}
借用上面写好的组件,我们可以完成一个小游戏
玩法是地图上随机生成导弹,玩家要躲避来袭的导弹,同时可以击毁导弹
在背景上挂载名为Missile_Dodge的C#脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Missile_Dodge : MonoBehaviour
{public GameObject Missile;public Transform pos;private float timer=3;//生成时间间隔Vector2 random_pos;void Update() {//每隔3s在随机位置生成导弹if(timer>=3){Generator();timer=0;}else{timer+=Time.deltaTime;}}void Generator(){random_pos.x=Random.Range(-10,10.1f);random_pos.y=Random.Range(-4.5f,4.6f);pos.position=random_pos;Instantiate(Missile,pos.position,pos.rotation);}
}
玩家控制脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MouseFlying : MonoBehaviour
{private float moveSpeed=5f;void Update(){transform.Translate(transform.up*moveSpeed*Time.deltaTime,Space.World);//转向鼠标的位置Vector2 dir=Camera.main.ScreenToWorldPoint(Input.mousePosition)-transform.position;transform.up=dir;}
}
效果图
Unity导弹,射击相关推荐
- 将Unity官方射击游戏 Space Shooter 改为实时对战小游戏,使用天梯实时对战服务(NanoLink)
将Unity官方射击游戏(Space Shooter)改为实时对战小游戏,使用天梯实时对战服务(NanoLink) io 类型游戏如此热门,有没有蠢蠢欲动? 如何让自己的游戏快速实现可实时联机对战? ...
- 【日常点滴019】Python制作流浪气球游戏(导弹射击类)
Python制作流浪气球游戏(导弹射击类) 教学课程代码(分步教学版) 1.构建全局通用代码结构 2.构建气球精灵类 3.构建导弹精灵类 4.碰撞检测 5.构建游戏信息类 (最终完整代码) 教学课程代 ...
- Unity空间射击游戏开发教程
描述 在本课程中,您将学习如何在unity中制作一款太空射击游戏.本课程使用全新的特性和编码实践,并且兼容所有较新版本的unity. 了解如何使用世界领先的免费游戏开发工具Unity创建太空射击游戏. ...
- unity太空射击源码_引擎入门 | 创建双杆射击游戏(入门 2)
点击上方"蓝字"关注我们吧! 本期我们继续为大家进行双杆射击游戏的后续教程 学习内容 3.整理资产 4.导入资产 5.安装 Blender 6.导入包 文章末尾可免费获取教程源代码 ...
- 对 Unity 太空射击游戏的实践
写在前面 # 本次 Space Shooter 实践通过实现以下功能达到加深对 U3D 游戏开发的认知. 键盘控制飞船移动; 发射子弹设计目标; 随机生成大量障碍物; 计分; 实现游戏对象的生命周期管 ...
- unity 开发射击打靶vr_暑假VR集训+unity自制射击游戏+李明
Unity完全自制游戏<射击>项目记录 不知不觉利用暑假的生活来学校参加VR培训已经有三个星期了,回顾这么多日子既忙碌又充实的生活.制作时间为期三周,老师为了更好的磨练我们,给我们布置了这 ...
- unity 开发射击打靶vr_【好玩微信小游戏大全】香肠派对:点开既玩的射击小游戏!正版授权...
沐沐带你发现好游戏! 沐沐今天推荐这款游戏叫<香肠派对>, 你以为是这款吃鸡的APP游戏吗? 大错特错! 沐沐我怎么会这么俗呢? 要推荐就推荐你没玩过的! 今天推荐这款<香肠派对&g ...
- Unity 子弹射击算法
主要参考链接中的博主 其实最为关键的就是LookAt这个方法,让子弹看向屏幕中心点检测到的位置 参考链接地址 https://assetstore.unity.com/packages/essenti ...
- [游戏开发][Unity] TPS射击游戏相机实现
TPS射击游戏要实现的功能有: 滑屏控制 角色的横向旋转 相机的纵向旋转(区别于横向旋转) 相机贴墙拉近(不能穿墙) 相机观察旋转(角色不转相机转用于观察四周) 开火按钮和旋转屏幕功能共存(边开枪边转 ...
- unity 开发射击打靶vr_自制Unity3D VR射击游戏
未经作者授权,禁止转载 课程的一个作业,第一次做vr游戏就放上来留个纪念,整理好会放上源代码和exe封装后的版本. 这个游戏可以不需要vr设备就能玩,已经内部设置了VR模拟器. 下面是readme文件 ...
最新文章
- 支付宝支付 第十二集:狂神、飞哥支付宝支付配置代码(免费资源,拿走不谢)
- PHP菜刀工具WebHandler
- wk一sm5时间温度控制器_新能源汽车电机控制器温度计算及其模型—DC电容篇
- 如何实现js调用java函数
- 博客属性10个非常不错的CSS技巧
- ultilize什么意思_ultilize是什么意思
- 今日上新:两个图像领域的现金奖励实时竞赛
- 能留住女友的,都是王者
- 社区拼团赛道的突然火爆,究竟是受何因素影响?
- 漏型和源型区分,NPN和PNP区别
- 大学计算机课要怎么学,大学计算机课学结
- Python新手-记一次股权穿透层级打分(森林实现)
- java 利用工具包Geotools实现不同坐标系之间坐标转换
- 微信分享 微信对图片文字大小的限制 代码如下
- 1.Java基础_Java入门--001
- 下三角输出和上三角输出
- ToolsOhの密码生成器(KT:java、zxcvbn、passay)
- 静悄悄的双11,有新意,有温度:国货潮与公益热正在改变商业
- 前端扑街仔的nginx配置
- 轨迹聚类光谱分析_光谱聚类
热门文章
- 批处理学习(一)——MS-DOS命令
- 关系型数据库基础概念:MySQL系列之开篇
- linux tac命令_Linux tac命令入门
- 用Python编程语言来实现阿姆斯特朗数的检查
- Android Studio实现记单词App,背完四六级一次过~
- python算积分蒙特卡罗_python编程通过蒙特卡洛法计算定积分详解
- to_param()函数和parameterize()函数
- elastic APM 简单使用
- Pyecharts上的颜色设置
- 实变函数(4)--Lebesgue积分