Unity2d 键盘操作的实现
键盘操作:
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 键盘操作的实现相关推荐
- 从MyEclipse到IntelliJ IDEA ——让你摆脱鼠标,全键盘操作
从MyEclipse到IntelliJ IDEA --让你摆脱鼠标,全键盘操作 从MyEclipse转战到IntelliJ IDEA的经历 我一个朋友写了一篇"从Eclipse到Androi ...
- 从MyEclipse到IntelliJ IDEA ——让你脱键盘,全键盘操作
2019独角兽企业重金招聘Python工程师标准>>> 从MyEclipse到IntelliJ IDEA --让你脱键盘,全键盘操作 从MyEclipse转战到IntelliJ ID ...
- Selenium之鼠标和键盘操作及扩展
概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作. ...
- Selenium3自动化测试——6.键盘操作
1. 实现目标 控制键盘,在百度首页的输入框进行输入,并点击"百度一下"进行搜索. 2. 实现代码 send_keys:键盘发送内容 输入框的id:kw 百度一下的id:su fr ...
- python鼠标键盘操作 PyUserInput
PyUserInput 键盘操作 from pykeyboard import PyKeyboard# 实例化 k = PyKeyboard()# 打印一个字符 按下+释放 k.press_key(' ...
- 通过python里面的pyautogui自动化控制鼠标和键盘操作
PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux). 安装 pip3 install pyautog ...
- 自动化测试之键盘操作和select操作
键盘操作 from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver=webdriver. ...
- 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的.我们最多需要"精通 "三种语言,最佳拍档是汇编.C.C++(或JAVA),很显然,如果你&qu ...
- 用键盘全局钩子[Hook]监视多进程键盘操作
用键盘全局钩子[Hook]监视多进程键盘操作 闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况.Hook安放和回调函数放在一个单独DLL中,DLL原码如下: //------- ...
最新文章
- EasyUI-DataGrid之批量删除
- OpenJDK install
- TCP连接的建立(二)
- 【面试招聘】非科班的秋招攻略贴
- TCGA样本命名详解
- 一直在构建工作空间_大华股份殷俊:AI,构建数字世界的基础
- MySQL查询不到中文的问题
- 搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点
- 流感传染(信息学奥赛一本通-T1191)
- 一文弄懂什么是Istio
- linux中的inode节点
- 从编写到上线带你搞定springboot博客01
- python groupby用法_Python数据分析黑色星期五-知识点整理
- 单CPU环境中如何实现多进程并行工作?
- 升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!
- jsp网页视频播放器
- win10下SVN图标不显示
- 无法使用安全密码身份验证登录到服务器,使用安全密码验证登录(SPA)”后为什么登录失败...
- Remix 完全本地化部署
- Fragment already added 错误