主要是移动脚本和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. HLJU 1220: AC100天 (枚举)

    1220: AC100天 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 89  Solved: 12 [id=1220">Submit ...

  2. 2012年公司组织旅游西安线个人记录(repost)

    2012年公司组织旅游西安线个人记录 文件夹 [隐藏]  1 序言 2 第1天 3 第2天 4 第3天 5 第4天 6 第5天 [title=2012%E5%B9%B4%E5%85%AC%E5%8F% ...

  3. 解决GitHub加载和下载慢问题

    1. 修改HOSTS文件: 在“C:\Windows\System32\drivers\etc” 下的HOSTS文件,添加以下地址:   151.101.44.249 github.global.ss ...

  4. 哨兵和docker容器

    1,redis哨兵的配置 redis-6379配置文件内容如下 cat redis-6379.conf port 6379 daemonize yes logfile "6379.log&q ...

  5. 授权QQ登录的qq端前端页面变迁

    ac_type = 'qq' if ac_type == 'qq': myid, mypwd = qq_key xp = '/html/body/div/div/div[2]/div/div/div/ ...

  6. HEX文件格式学习笔记

    这也是一篇学习摘抄:原文地址:http://blog.csdn.net/syrchina/article/details/7004998        为了编写一个可以按照自己的要求进行ISP的程序, ...

  7. Buildroot用户指南【转】

    本文转载自:http://www.voidcn.com/blog/bytxl/article/p-4727302.html 第一章        关于Buildroot Buildroot是一个包含M ...

  8. 从sp_executesql中返回table型数据及动态SQL语句的参数化查询

    在返回分页数据时,我们会经常会用到参数化传递过滤条件,如何拼接SQL语句成了一个难题. 我们可以这样拼接: exec('sp_executesql sql语句,参数定义,参数值') sql语句和参数定 ...

  9. ThreadLocal工具类的使用(隔离思想)

    ThreadLocal不是用来解决共享对象的多线程访问问题的, 通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象, ...

  10. [noip模拟赛]午餐

    https://www.zybuluo.com/ysner/note/1325779 题面 一共有\(n\)个人,林先森知道开始时只有\(1\)号会毒瘤算法.林先森了解到很多人一起吃过 午餐;具体地, ...