目录

选择齿轮图片

设置单位像素数

给齿轮添加刚体

设置重力大小为0

冻结旋转

添加2D碰撞盒

子弹挂载脚本

制作成预制体

设定玩家层和子弹层

项目设置:不允许子弹层与子弹层、子弹层与玩家层发生碰撞

玩家调用脚本


选择齿轮图片

设置单位像素数

给齿轮添加刚体

设置重力大小为0

冻结旋转

添加2D碰撞盒

子弹挂载脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;public class BulletControl : MonoBehaviour
{Rigidbody2D rbody;//子弹命中声public AudioClip hitClip;// Start is called before the first frame update
void Awake(){rbody = GetComponent<Rigidbody2D>();//2秒后不管打没打中,子弹销毁子弹Destroy(this.gameObject, 2f);}// Update is called once per framevoid Update(){}//子弹发射,射击public void Shoot(Vector2 moveDirection,float moveForce){rbody.AddForce(moveDirection * moveForce);}//子弹命中private void OnCollisionEnter2D(Collision2D collision){//调用机器人控制脚本的修复函数,修改机器人的状态RobotControl ec = collision.gameObject.GetComponent<RobotControl>();if (ec!=null){ec.Fixed();//杀敌if (RobotControl.isFixed%2==0){collision.gameObject.GetComponent<AIPath>().enabled = false;PlayerControl.enemyleft--;//更改玩家控制中的击杀数,以此判断任务是否完成,格式:脚本名.静态变量--;Debug.Log("当前敌人数:" + PlayerControl.enemyleft);}if (RobotControl.isFixed%2 != 0){//打开命中对象的AI组件collision.gameObject.GetComponent<AIPath>().enabled = true;//collision.gameObject.GetComponent<RobotControl>().enabled = false;//RobotControl.AIon();//ScriptSelect.changestatus();}Debug.Log("命中敌人了");}//播放命中声AudioManager.instance.AudioPlay(hitClip);//立即销毁子弹Destroy(this.gameObject);}
}

制作成预制体

设定玩家层和子弹层

项目设置:不允许子弹层与子弹层、子弹层与玩家层发生碰撞

玩家调用脚本

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class PlayerControl : MonoBehaviour
{//主角速度public float speed = 8f;//定义2d刚体Rigidbody2D rbody;//定义动画Animator anim;//初始屏幕看Vector2 lookDirection = new Vector2(0, -1);//定义一个机器人对象GameObject robotObj;//最大健康值private int maxHealth = 2;//改为2;//当前健康值private int currentHealth;//其他脚本可获取最大健康值public int MyMaxHealth { get { return maxHealth; } }//其他脚本可获取当前健康值public int MyCurrentHealth { get { return currentHealth; } }//无敌时间private float wuditime = 2f;//无敌计时器private float wuditimer;//无敌状态private bool isWudi;//子弹数量[SerializeField]private int curBulletCount=1;private int maxBulletCount=6;public float gametime=0;public int MyCurBulletCount { get { return curBulletCount; } }public int MyMaxBulletCount { get { return maxBulletCount; } }//子弹预制体public GameObject bulletPrefab;//敌人剩余数量public static int enemyleft;//public int curEnemyleft { get { return enemyleft; } }//游戏结束提示public GameObject GameOver;//指定为主角并销毁public GameObject GameOverPlayer;//任务完成提示public GameObject MissionCompleted;//无法实现在其他脚本中销毁提示,故在此脚本中限时销毁public float showTime = 3;private float showTimer;//智能提示框计时器public float tiptime = 6;private float tiptimer;//任务完成标记,显示标志,一场游戏中只显示一次public static int showflag=0;//玩家音效public AudioClip hitClip;public AudioClip launchClip;//智能提示文本public Text tips;public GameObject tipsframe;// Start is called before the first frame updatevoid Start(){//操作方式选择ctrlway();//任务完成状态的初始化showflag = 0;//隐藏任务完成提示MissionCompleted.SetActive(false);//提示计时器设置为负值showTimer = -1;tiptimer = -1;//开始游戏后初始化敌人数量SetEnemyNum();//获取2d刚体rbody = GetComponent<Rigidbody2D>();//获取动画组件anim = GetComponent<Animator>();//初始化生命值currentHealth = 1;//初始化无敌时间wuditimer = 0;//更新生命条与子弹数量UIManager.instance.UpdateHealthBar(currentHealth, maxHealth);UIManager.instance.UpdateBulletCount(curBulletCount, maxBulletCount);}// Update is called once per framevoid Update(){if(showflag!=1){UpdateTime();}UpdateEnemyLeft();//任务完成显示 计时器showTimer -= Time.deltaTime;//提示框显示 计时器tiptimer -= Time.deltaTime;//超过时间就取消显示任务完成if (showTimer < 0){   MissionCompleted.SetActive(false);}/*//超过时间就取消显示提示文本if(tiptimer<0){tipsframe.SetActive(false);}*///取消显示提示文本if(showTimer+5<0){tipsframe.SetActive(false);}//敌人数量为0,并且是第一次达到0,之前没有完成任务,任务完成if (enemyleft==0 && showflag != 1){//给倒计时器赋值,以此显示提示showTimer = showTime;//已经完成任务了,标记一下,之后不再显示showflag = 1;//显示任务完成提示MissionCompleted.SetActive(true);//显示前往下一关的提示tip();}//如果生命值为0,显示游戏结束字样,并销毁主角if (currentHealth==0){GameOver.SetActive(true);tip();GameObject.Find("Ruby").GetComponent<PlayerControl>().enabled = false;//gameObject.SetActive(false);//Destroy(GameOverPlayer);}//如果没有子弹了,则进行提示if(curBulletCount==0 && currentHealth!=0){tip();}//如果游戏超时,则进行提示if (gametime > 180){tip();}float moveX=0;float moveY=0;//如果没有禁用键盘if (UIEntry.ctrlflag != 2){//获取运动矢量moveX = Input.GetAxisRaw("Horizontal");moveY = Input.GetAxisRaw("Vertical");}Vector2 moveVector = new Vector2(moveX, moveY);if(moveX!=0||moveY!=0){lookDirection = moveVector;}Vector2 position = transform.position;position.x += moveX * speed * Time.deltaTime;position.y += moveY * speed * Time.deltaTime;transform.position = new Vector2(position.x, position.y);//用刚体移动可以消除画面抖动rbody.MovePosition(position);//为动画集赋值//状态集的切换由运动矢量决定anim.SetFloat("move X",lookDirection.x);anim.SetFloat("move Y",lookDirection.y);anim.SetFloat("runspeed", moveVector.magnitude);//赋值必须与状态集命名一样//如果处于无敌状态,就计时if(isWudi){wuditimer -= Time.deltaTime;//计时器归0,就不处于无敌状态了if(wuditimer<0){isWudi = false;}}//当按下J,并且子弹大于0,开火(没有禁用键盘)if(Input.GetKeyDown(KeyCode.J) && curBulletCount>0 && UIEntry.ctrlflag != 2){ChangeBulletCount(-1);anim.SetTrigger("Launch");AudioManager.instance.AudioPlay(launchClip);GameObject bullet = Instantiate(bulletPrefab, rbody.position+Vector2.up*0.5f, Quaternion.identity);BulletControl bc = bullet.GetComponent<BulletControl>();if(bc!=null){bc.Shoot(lookDirection, 300);}}//按下鼠标左键,开枪(没有禁用鼠标)if (Input.GetMouseButtonDown(1) && curBulletCount > 0 && UIEntry.ctrlflag != 3){RaycastHit2D raycast = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);Vector2 hitPoint = new Vector2(raycast.point.x, raycast.point.y);Vector2 curposition = new Vector2(gameObject.transform.position.x, gameObject.transform.position.y);Vector2 ShootDirection = hitPoint - curposition;ChangeBulletCount(-1);anim.SetTrigger("Launch");AudioManager.instance.AudioPlay(launchClip);GameObject bullet = Instantiate(bulletPrefab, rbody.position + Vector2.up * 0.5f, Quaternion.identity);BulletControl bc = bullet.GetComponent<BulletControl>();if (bc != null){bc.Shoot(ShootDirection, 300);//lookDirection}}//按E与npc交互if (Input.GetKeyDown(KeyCode.E)){RaycastHit2D hit = Physics2D.Raycast(rbody.position, lookDirection, 2f, LayerMask.GetMask("NPC"));if(hit.collider!=null){Debug.Log("hit npc!");NPCManager npc = hit.collider.GetComponent<NPCManager>();if(npc!=null){npc.ShowDialog();}}}}private void OnTriggerEnter2D(Collider2D collision){//踩到雷区,自动生成僵尸float robotX = Random.Range(-3, 5);float robotY = Random.Range(-3, 5);Vector2 position_robot = new Vector2(robotX, robotY);if(collision.gameObject.tag=="bomb")//如果碰到雷区{print("other.tag=" + collision.gameObject.tag);//这句一定要有,不然出不来robotObj = Instantiate(Resources.Load("Prefabs/Robot"),position_robot,Quaternion.identity)as GameObject;//加载资源,生成一个预制体,做成一个对象}}private void OnTriggerExit2D(Collider2D collision){//离开雷区,僵尸消失if(collision.gameObject.tag=="bomb"){Destroy(robotObj);}}public void changeHealth(int amount){//可能是受到伤害,也可能是加血if(amount<0){//如果是受伤,设置无敌状态,则2秒内不能受伤if(isWudi==true){return;}isWudi = true;//播放受伤动画anim.SetTrigger("Hit");//播放受伤音效AudioManager.instance.AudioPlay(hitClip);//为无敌计时器赋值wuditimer = wuditime;}//更改健康值currentHealth = Mathf.Clamp(currentHealth+amount,0,maxHealth);//更新血条UIManager.instance.UpdateHealthBar(currentHealth, maxHealth);//调试Debug.Log(currentHealth + "/" + maxHealth);}public void ChangeBulletCount(int amount){//改变子弹数curBulletCount = Mathf.Clamp(curBulletCount + amount, 0, maxBulletCount);//改变UI子弹数UIManager.instance.UpdateBulletCount(curBulletCount, maxBulletCount);}public void UpdateTime(){//游戏时间gametime += Time.deltaTime;//Debug.Log((int)gametime);//改变UI时间UIManager.instance.UpdateTimeBar((int)gametime);}public void UpdateEnemyLeft(){UIManager.instance.UpdateEnemyLeft(enemyleft);}void SetEnemyNum(){int index = SceneManager.GetActiveScene().buildIndex;if(index==1){enemyleft = 2;}if(index==2){enemyleft = 3;}}public void ctrlway(){if(UIEntry.ctrlflag==1){GameObject.Find("Ruby").GetComponent<PlayerControl>().enabled = true;GameObject.Find("Ruby").GetComponent<Follow>().enabled = true;}else if(UIEntry.ctrlflag == 2){//不能禁用这个脚本,改为在if语句中利用UIEntry.ctrlflag禁用操作//GameObject.Find("Ruby").GetComponent<PlayerControl>().enabled = false;GameObject.Find("Ruby").GetComponent<Follow>().enabled = true;}else if(UIEntry.ctrlflag == 3){GameObject.Find("Ruby").GetComponent<PlayerControl>().enabled = true;GameObject.Find("Ruby").GetComponent<Follow>().enabled = false;}}public void tip(){//tiptimer = tiptime;if(showflag==1){int index = SceneManager.GetActiveScene().buildIndex;if(index==1){tipsframe.SetActive(true);tips.text = "Tips:\n快前往城堡,进行下一关吧!";}else if(index==2){tipsframe.SetActive(true);tips.text = "Tips:\n亲亲、你已经通关了,请五星好评哦!";}}else if(currentHealth==0){tipsframe.SetActive(true);int index = SceneManager.GetActiveScene().buildIndex;if(index==1){tips.text = "Tips:\n该长教训了吧,哈哈!";}else if(index==2 && RobotControl.isFixed%2==1){tips.text = "Tips:\n机器人被激怒,会主动攻击人哦。尝试着对它连续完成两次攻击吧!";}else if (index == 2 && RobotControl.isFixed % 2 != 1){tips.text = "Tips:\n你可长点教训吧,哈哈!";}else{return;}}else if(curBulletCount==0 && currentHealth!=0){tipsframe.SetActive(true);tips.text = "Tips:\n没有子弹了,快去拾取子弹吧!";}else if(gametime>180){tipsframe.SetActive(true);tips.text = "Tips:\n游戏超时了哦";}}
}

附完整教程:

Unity2d Rubys Adventure 课程设计报告

Unity2d 玩家发射子弹相关推荐

  1. Unity中玩家的攻击(发射子弹,挥剑)

    目前来说,我就知道玩家两种攻击方式,1.发射(子弹,弓箭),2.挥剑 1.发射子弹 想要玩家发射子弹,需要制作两个部分(玩家发射动画除外),第一个部分就是控制玩家的脚本,第二部分则是子弹部分,子弹部分 ...

  2. 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波...

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  3. Unity射击游戏发射子弹的方法和提升流畅性的小技巧

    引言 在某些射击游戏里(2D和3D都适用),可能你需要创建子弹,第一想到的可能是新建一个发射子弹的脚本,就叫BulletController,然后每次按下什么键就直接上Instantiate函数. 伪 ...

  4. cocos做飞机大战笔记【敌机发射子弹】

    文章目录 前言 敌机脚本 1. 初始变量 2. 子弹发射逻辑 3. 初始化敌机状态和子弹状态 子弹脚本 1.创建初始变量与飞机子弹类型判断逻辑 2. 状态初始化 游戏管理脚本 完整代码 GameMan ...

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

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

  6. Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

    Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...

  7. Python“飞机大战”上下左右移动空格发射子弹

    下载点此去 最后面有运行视频 一.项目背景 作为一名学习计算机的学生,在以往,我认为学习计算机要么就是无所不能的黑客,要么就是能制作出各种软件程序的大神.我选择pygame板块,制作一款能随意更改游戏 ...

  8. Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

    同样是从网上看到的一个需求,需求描述都在代码中. 不多说了,直接贴代码了.相信大家都能够看得懂的! package cn.yw.bore;import java.util.ArrayList; imp ...

  9. Python案例:飞船向右发射子弹

    一.功能要求 1.按上下方向键,可以上下移动飞船,但是不能移出上下边界. 2.按空格键,飞船水平向右发射子弹,子弹越出右边界就销毁. 二.案例演示 (一)运行效果 (二)实现步骤 1.创建Python ...

最新文章

  1. 怎么用vc采集ni卡数据_SystemLink自学笔记(6):SystemLink架构和数据服务
  2. tomcat闪退没有报错_Appium在Android平台几种常见报错的解决方案
  3. pycharm最左侧Tool Buttons显示不全的问题解决
  4. Windows Terminal 新手入门
  5. 奔跑吧Linux内核初识
  6. php按照文件名字排序,php readdir 排序问题,如何按照日期进行排序
  7. 端智能揭秘|促使双十一GMV大幅提升,手淘用了什么秘密武器?
  8. Redis 究竟适不适合当队列来用?
  9. webpack+ES6+Sass搭建多页面应用
  10. JSP — GET 与 POST 的区别
  11. MDT实现windows系统批量部署
  12. 正确的逛Github-寻找优秀的中文项目
  13. avr单片机动态数码管c语言,AVR单片机8位数码管显示的程序实现(两种方法介绍)...
  14. 银行客户流失分析预测
  15. Proxmox VE 7.2 更改登录横幅
  16. 开发一个类似美团的外卖小程序多少钱
  17. for循环的说课c语言,教学设计《程序的循环结构-For循环语句》
  18. HTML实现简单的网页设计。
  19. 西瓜微数独家解析: 干货管饱|帮你省XXX万广告费的KOL投放指南
  20. 综合素质计算机的知识考点,综合素质常识考题

热门文章

  1. 搭建个人博客网站 -- vue初学者学习总结
  2. 应用在华为P9手机上安装失败原因分析 (错误码:-110)
  3. MySQL删除或清空表中数据的方法
  4. 【总结】2017年中小结
  5. SpringMVC中的@InitBinder注解【记录】
  6. 抖音视频内搜索关键词怎样才能让搜索排序靠前?
  7. 苹果手机老是提示存储空间不足
  8. 如何从Twitch Prime申请免费游戏和游戏内物品
  9. 点阵字符和矢量字符的区别
  10. 赚钱就是简单的事情反复去做坚持