主要是移动脚本和2个技能的脚本编写。

首先是移动的脚本:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class playerMove : MonoBehaviour
{
public float rotateSpeed = 1f;
public float moveSpeed = 0.08f;
public Texture aimImage;
//大键盘wsad控制人物移动
void moveBigKeyboard()
{
if (Input.GetKey("a"))
{
transform.Translate(, , * moveSpeed);
}
else if (Input.GetKey("d"))
{
transform.Translate(, , - * moveSpeed);
}
else if (Input.GetKey("s"))
{
transform.Translate(- * moveSpeed, , );
}
else if (Input.GetKey("w"))
{
transform.Translate( * moveSpeed, , );
}
}
//鼠标左右移动控制前进方向
void moveMouse()
{
transform.Rotate( , Input.GetAxis("Mouse X") * rotateSpeed, );
}
void OnGUI()
{
Screen.lockCursor = true;
//绘制准心
//Rect rect = new Rect(Input.mousePosition.x - (aimImage.width >> 1),
//Screen.height - Input.mousePosition.y - (aimImage.height >> 1),
//aimImage.width, aimImage.height);
//如果要加y轴,可以加
Rect aimRect = new Rect(Input.mousePosition.x - , -Input.mousePosition.y + , , );
GUI.DrawTexture(aimRect, aimImage); }
void FixedUpdate()
{
moveBigKeyboard();
moveMouse();
} }

然后是技能脚本:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class skill : MonoBehaviour
{ //【地爆天星】z键触发,六个小球出现,小球依次消失
public GameObject ChibukaTensei;
void skillChibukaTensei()
{
if (Input.GetKey("z"))
{
GameObject CT1, CT2, CT3, CT4, CT5, CT6;
CT1 = Instantiate(ChibukaTensei, transform.TransformPoint(, , ), ChibukaTensei.transform.rotation);
CT2 = Instantiate(ChibukaTensei, transform.TransformPoint(, , -), ChibukaTensei.transform.rotation);
CT6 = Instantiate(ChibukaTensei, transform.TransformPoint(, , ), ChibukaTensei.transform.rotation);
CT3 = Instantiate(ChibukaTensei, transform.TransformPoint(, , -), ChibukaTensei.transform.rotation);
CT5 = Instantiate(ChibukaTensei, transform.TransformPoint(, , ), ChibukaTensei.transform.rotation);
CT4 = Instantiate(ChibukaTensei, transform.TransformPoint(, , ), ChibukaTensei.transform.rotation);
Destroy(CT1, );
Destroy(CT2, );
Destroy(CT3, );
Destroy(CT4, );
Destroy(CT5, );
Destroy(CT6, );
}
} //【Fireball】双锤普攻,鼠标左键施法准备火球,满足【锤头=红色+火球集气到最大】的要求后,松开左键释放火球;右键集气
public GameObject Fireball;//实例化的对象
int cd = ;//【Fireball】集气计数器。满50,才可能火球施放成功
int scale = ;//【Fireball】释放计数器。释放次数满50,火球才能施放成功
public Camera aim;//瞄准摄像头
void skillFireball()
{ GameObject FB;
//松开左键时
if (Input.GetMouseButtonUp())
{
//锤头为红色,且火球最大时,发射火球
if (Color.red == GameObject.Find("top1").GetComponent<Renderer>().material.color & scale == )
{
//发射成功后锤头变白
GameObject.Find("top1").GetComponent<Renderer>().material.color = Color.white;
GameObject.Find("top2").GetComponent<Renderer>().material.color = Color.white;
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
//先把火球缩小,然后随着scale值逐渐变大
FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale);
//这是在给火球确认射击方向。如果这个放FixedUP下面,就会导致火球飞出去后,前进方向会跟着镜头变
FB.transform.LookAt(aim.transform.forward * );
//为了营造【螺旋丸】的效果,预制体rigidbody里的FreezeRotation都要解锁;但在成功发射火球时要锁上,不然就会乱飞。
FB.GetComponent<Rigidbody>().freezeRotation = true;
Debug.Log("发射火球成功");
} //其它情况,火球大小变为0
else
{
scale = ;
} }
//左键施法
else if (Input.GetMouseButton())
{ //点击右键时左键一直在按==左右键一直按
if (Input.GetMouseButton())
{
//实例化一个小火球
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
FB.transform.localScale = new Vector3(0.275f, 0.25f, 0.175f);
//火球变成脚本附着物的子物体
FB.transform.parent = this.transform;
//我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的
Destroy(FB, 0.01f);
}
else if (cd == )
{
//实例化火球
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
//火球变成脚本附着物的子物体
FB.transform.parent = this.transform;
FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale);
Destroy(FB, 0.1f);
}
else if (cd < )
{
Debug.Log("cd<0");
}
else if (cd > )
{
cd -= ;
scale += ;
GameObject.Find("Hammer1").transform.Rotate(, , -0.5f);
//实例化火球
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
//火球变成脚本附着物的子物体
FB.transform.parent = this.transform;
//先把火球缩小,然后随着scale值逐渐变大
FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale);
//我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为物体有体积同一个地方出现会顶前面出现的乱飞
Destroy(FB, 0.1f);
}
else if (cd == )
{
//什么都不发生
} }
//右键集气
else if (Input.GetMouseButton())
{
//右键一直在按时点击左键
if (Input.GetMouseButton())
{
//实例化一个小火球
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
FB.transform.localScale = new Vector3(0.275f, 0.25f, 0.175f);
//火球变成脚本附着物的子物体
FB.transform.parent = this.transform;
//我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的
Destroy(FB, 0.01f);
}
//cd不能大于50
else if (cd > )
{
cd = ;
}
//集气满时,锤头变红,scale=0
else if (cd == )
{
scale = ;
GameObject.Find("top1").GetComponent<Renderer>().material.color = Color.red;
GameObject.Find("top2").GetComponent<Renderer>().material.color = Color.red;
}
else if(cd >= )
{
cd += ;
GameObject.Find("Hammer1").transform.Rotate(, , 0.5f);
}
else if (cd < )
{
Debug.Log("cd<0");
} }
//左右键一起按 else if (Input.GetMouseButton() & Input.GetMouseButton())
{
//实例化一个小火球
FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, , 0.01999918f), Fireball.transform.rotation);
FB.transform.localScale = new Vector3(1f , 1f , 1f );
//火球变成脚本附着物的子物体
FB.transform.parent = this.transform;
//我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的
Destroy(FB, 0.01f);
Debug.Log("左右键一起按");
} //松开左键时右键仍在按
else if (Input.GetMouseButtonUp())
{
scale = ;
}
} void Update()
{
skillChibukaTensei();
//【Fireball】如果不放这,鼠标松开这个事件有时候会检测不到,造成技能释放失败
skillFireball();
//只有火球发射成功了,下面的代码才能执行一次。注意,是一次!火球没成功的帧,下面是无法执行的,因为没成功就不会有长时间存在的Fireball(Clone)对象(临时的那种,是0.01秒消失,基本就是一帧不到就没了)
GameObject.Find("Fireball(Clone)").transform.Rotate(,,);
GameObject.Find("Fireball(Clone)").transform.Translate(, , 0.2f);
Destroy(GameObject.Find("Fireball(Clone)"),);
}
void FixedUpdate()
{ }
}

注意这个技能脚本会有报错,但这是正常的

我还是第一次写出一个【报错】但是正常的程序。

之所以报错,是因为void Update()函数里的Fireball(Clone)是只有【火球释放成功】才会出现的物体,所以代码里你是找不到这个物体的,就报错了

但恰恰就是这样才能实现这个【火球成功释放往前射击】的效果。

我自己目前没有能力让程序不报错也能实现这一点....所以先这样吧

【fireball】这个技能的脚本花掉了我一天的时间

主要问题是逻辑上,一开始我是按玩家可能出现的操作进行分类写多个if来判断

后来越写越乱....我冷静了一下,发现这个角度去写不对,肯定有一个角度更便捷也更准确

后来我想到了,从我提供给玩家的按键出发即可:

要么是左键,要么是右键。剩下的可能结果,都是出自这两个中,把if丢进这两个大类里就好了!

虽然改进了角度,但还是需要实际测试,才慢慢完善了后面的多个else if内容。

肯定还有疏漏之处,毕竟这个技能是整个demo的核心,我还要继续完善这个技能脚本的。

Unity笔记(4)自学第四、五天的更多相关文章

  1. 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档

    孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...

  2. 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务

    孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...

  3. 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库

    孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...

  4. 孤荷凌寒自学python第五十五天初识MongoDb数据库

    孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...

  5. 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录

     孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...

  6. 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录

    孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...

  7. 孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase

    孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase (完整学习过程屏幕记录视频地址在文末) 之前对关系型数据库的学习告一段落,虽然能力所限没有能够完全完成理想中的所有数据库操 ...

  8. 孤荷凌寒自学python第五天初识python的列表

    孤荷凌寒自学python第五天 列表 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 粗俗地区分列表,可以这样理解,定义或print列表后显示时,列表中的各元素都是用一个方括号[]括起来的. ...

  9. HMM 自学教程(五)前向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  10. 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库

    孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...

随机推荐

  1. Java - split()函数和trim()函数的使用方法

    split()函数和trim()函数的使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141 详细參考Java ...

  2. oracle连接串的一种写法

    我在.NET项目里访问oracle,向来是规规矩矩地这样写: DATA SOURCE=PDBGZFBC;PASSWORD=test;PERSIST SECURITY INFO=True;USER ID ...

  3. mongo13----application set与分片结合

    replation set配合分片 打开3台服务器,B服务器()放configserv, C,D服务器(203.204)放置复制集 .203和192.168.1.204分别运行之前的sh start. ...

  4. 织梦发布的文章如何批量替换文章"来源"和"作者"?

    做的网站中已经采集好并已生成HTML了的文章或以前已发布的文章如何快速批量替换所有“来源”和“作者”呢?第一步:打开:dede模板网站(后台目录)\templets\article_add.htm ( ...

  5. Oracle VM VirtualBox启动新建虚拟机弹错--不能为虚拟机xxxx电脑 打开一个新任务

    有三种方案: 1.先在任务管理器中关掉所有virtualBox的进程,然后进入到C:\Users\Administrator\VirtualBox VMs\ 将相应guest的文件夹随便改个名字,再重 ...

  6. Ajax跨域访问等问题

    前端时间公司接口整顿,所有接口放一起了,然后我就写了一大堆API接口....... 今天用上了,公用人员库,前台通过ajax访问, 先是以‘json’作为数据格式进行访问,直接response fie ...

  7. Oracle 11g导出来的dmp导入到 10g的数据库(IMP-00010:不是有效的导出文件,头部验证失败)

    原文地址:http://www.cnblogs.com/alxc/archive/2011/03/25/1995279.html 因为喜欢新的东西,所以基本上电脑的开发工具都是最新的,oracle也装 ...

  8. Hibernate4 拦截器(Interceptor) 实现实体类增删改的日志记录

    转自:https://blog.csdn.net/he90227/article/details/44783099 开发应用程序的过程中,经常会对一些比较重要的数据修改都需要写日志.在实际工作的工程中 ...

  9. WebLogic之eclipse安装WebLogic插件

    转自:https://blog.csdn.net/magi1201/article/details/38323775

  10. RocketMQ消费者实践

    最近工作中用到了RocketMQ,现记录下,如何正确实现消费~ 消费者需要注意的问题 防止重复消费 如何快速消费 消费失败如何处理 Consumer具体实现 防止重复消费 重复消费会造成数据不一致等问 ...