键盘操作:

WSAD上下左右

E 与长者对话

J 攻击

移动

        //x方向移动分量float moveX=0;//y方向移动分量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);

对话

        //按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();}}}}

攻击

        //按下鼠标左键,开枪(没有禁用鼠标)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}}

详细脚本

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. 从MyEclipse到IntelliJ IDEA ——让你摆脱鼠标,全键盘操作

    从MyEclipse到IntelliJ IDEA --让你摆脱鼠标,全键盘操作 从MyEclipse转战到IntelliJ IDEA的经历 我一个朋友写了一篇"从Eclipse到Androi ...

  2. 从MyEclipse到IntelliJ IDEA ——让你脱键盘,全键盘操作

    2019独角兽企业重金招聘Python工程师标准>>> 从MyEclipse到IntelliJ IDEA --让你脱键盘,全键盘操作 从MyEclipse转战到IntelliJ ID ...

  3. Selenium之鼠标和键盘操作及扩展

    概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作. ...

  4. Selenium3自动化测试——6.键盘操作

    1. 实现目标 控制键盘,在百度首页的输入框进行输入,并点击"百度一下"进行搜索. 2. 实现代码 send_keys:键盘发送内容 输入框的id:kw 百度一下的id:su fr ...

  5. python鼠标键盘操作 PyUserInput

    PyUserInput 键盘操作 from pykeyboard import PyKeyboard# 实例化 k = PyKeyboard()# 打印一个字符 按下+释放 k.press_key(' ...

  6. 通过python里面的pyautogui自动化控制鼠标和键盘操作

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux). 安装 pip3 install pyautog ...

  7. 自动化测试之键盘操作和select操作

    键盘操作 from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver=webdriver. ...

  8. 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇

    计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的.我们最多需要"精通 "三种语言,最佳拍档是汇编.C.C++(或JAVA),很显然,如果你&qu ...

  9. 用键盘全局钩子[Hook]监视多进程键盘操作

    用键盘全局钩子[Hook]监视多进程键盘操作 闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况.Hook安放和回调函数放在一个单独DLL中,DLL原码如下: //------- ...

最新文章

  1. EasyUI-DataGrid之批量删除
  2. OpenJDK install
  3. TCP连接的建立(二)
  4. 【面试招聘】非科班的秋招攻略贴
  5. TCGA样本命名详解
  6. 一直在构建工作空间_大华股份殷俊:AI,构建数字世界的基础
  7. MySQL查询不到中文的问题
  8. 搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点
  9. 流感传染(信息学奥赛一本通-T1191)
  10. 一文弄懂什么是Istio
  11. linux中的inode节点
  12. 从编写到上线带你搞定springboot博客01
  13. python groupby用法_Python数据分析黑色星期五-知识点整理
  14. 单CPU环境中如何实现多进程并行工作?
  15. 升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!
  16. jsp网页视频播放器
  17. win10下SVN图标不显示
  18. 无法使用安全密码身份验证登录到服务器,使用安全密码验证登录(SPA)”后为什么登录失败...
  19. Remix 完全本地化部署
  20. Fragment already added 错误

热门文章

  1. 快来看看阿里巴巴的常用面试题
  2. 推荐一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,免费使用,堪称辅助神器!
  3. KingbaseES V8R6集群外部备份案例
  4. linux cpu do idle,Linux cpuidle framework(1)_概述和软件架构
  5. 写文档,服务自己也服务大家,最终成就自己
  6. Windows下Android开发环境配置
  7. vue3基础-组合式API之生命周期钩子
  8. Annotation注解
  9. web项目创建桌面快捷键
  10. Oracle的结构体系的抽象(1)