Unity笔记(4)自学第四、五天
主要是移动脚本和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)自学第四、五天的更多相关文章
- 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...
- 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务
孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...
- 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...
- 孤荷凌寒自学python第五十五天初识MongoDb数据库
孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...
- 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录
孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录
孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- 孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase
孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase (完整学习过程屏幕记录视频地址在文末) 之前对关系型数据库的学习告一段落,虽然能力所限没有能够完全完成理想中的所有数据库操 ...
- 孤荷凌寒自学python第五天初识python的列表
孤荷凌寒自学python第五天 列表 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 粗俗地区分列表,可以这样理解,定义或print列表后显示时,列表中的各元素都是用一个方括号[]括起来的. ...
- HMM 自学教程(五)前向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库
孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...
随机推荐
- 在windows cgywinportable上,通过运行linux命令,批量改动文件名。
在windows cgywinportable上.通过运行linux命令.批量改动文件名. 实例:将当前文件夹下的全部文件名称加上.sql find ./ -type f -exec mv {} ' ...
- 关于MySQL的TPS和QPS
TPS - Transactions Per Second(每秒传输的事物处理个数),这是指server每秒处理的事务数,支持事务的存储引擎如InnoDB等特有的一个性能指标. 计算方法: TPS = ...
- 2016/3/20 数组定义 数组遍历 超全局数组 数组元素设置(in_array() 、array_reverse()、count()、array_unique()、unset()、array_values、array_merge、array_push) 列表实例
一.数组定义 php数组与其他语言的数组的不同: 其他例如java语言 :同一种类型数据的集合. php:数组可以存储任何类型的数据.同一个数组中可以放int类型也可以放string类型 ①索引数组的 ...
- MVC优缺点
1.通过把项目分成model view和controller,使得复杂项目更加容易维护. 2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为 3.应用程序通过contro ...
- Apache Hadoop 3.0.0 Release Notes
http://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-common/release/3.0.0/RELEASENOTES.3. ...
- git pull ,git fetch ,git merge
git pull 是git fetch与git merge的组合. 有时候拆开使用,会更加的安全. 比如想比较,本地分支,与线上分支的差别,就可以先 git fetch 这样就可以,git diff ...
- 【AHOI 2005】 约数研究
[题目链接] 点击打开链接 [算法] 要求M,显然可以通过约数个数定理从1..N暴力计算答案,然而n最大10^6,这个算法的时间复杂度是 O(N * sqrt(N))的,不能通过此题 因此我们换一种思 ...
- 转【前端基础进阶之Promise】
前言 Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. 在实际的使用当中,有非常多的应用场景我 ...
- Bootstrap 垂直(默认)表单
在建立asp.net mvc视图中,默认的表单是垂直表单,与vs 自动创建的T4模板是水平表单,相比较,没有了<div class="form-horizontal"> ...
- MySQL(调优慢查询、explain profile) 转
转自http://www.linuxidc.com/Linux/2012-09/70459.htm mysql profile explain slow_query_log分析优化查询 在做性能测试中 ...