主要是移动脚本和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. Why Do Microservices Need an API Gateway?

    Why Do Microservices Need an API Gateway? - DZone Integration https://dzone.com/articles/why-do-micr ...

  2. 通过fsharp 使用Enterprise Library Unity 3 - 三种拦截模式的探索

    这篇就三种拦截模式进行一下探索. 特性总结   类型 特点 其它 InterfaceInterceptor Innstance 仅单接口 类内部函数互相引用无法引起拦截行为 TransparentPr ...

  3. 在win10 docker启动的centos容器中安装nginx

    我是在win10机器上搭建了一个docker,在docker启动了centos容器,在centos中安装nginx. 安装配置docker 直接在官网下载docker for windows:http ...

  4. BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图

    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...

  5. 【基于libRTMP的流媒体直播之 AAC、H264 解析】

    前文我们说到如何在基于 libRTMP 库的流媒体直播过程中推送 AAC .H264 音视频流.本文以上文为基础,阐释如何对 RTMP 包进行解析.重组得到原始的 AAC 音频帧以及 H264 码流. ...

  6. python的termcolor模块

    termcolor是一个python包,可以改变控制台输出的颜色,支持各种terminal(WINDOWS的cmd.exe除外). 它支持下列的文字颜色: grey, red, green, yell ...

  7. Macaca框架

    收藏 http://www.cnblogs.com/jinjiangongzuoshi/p/6537795.html

  8. Vijos P1951 玄武密码 (AC自动机)

    描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...

  9. CodeForces 723C Polycarp at the Radio (题意题+暴力)

    题意:给定 n 个数,让把某一些变成 1-m之间的数,要改变最少,使得1-m中每个数中出现次数最少的尽量大. 析:这个题差不多读了一个小时吧,实在看不懂什么意思,其实并不难,直接暴力就好,n m不大. ...

  10. Fiddler对https抓包时,提示"HTTPS decryption is disabled."原因及破解

    Fiddler对https抓包时,提示"HTTPS decryption is disabled." 原因:没有启用 https 解密. 破解: ----------------- ...