Unity笔记(4)自学第四、五天
主要是移动脚本和2个技能的脚本编写。
首先是移动的脚本:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 6 7 public class playerMove : MonoBehaviour 8 { 9 public float rotateSpeed = 1f; 10 public float moveSpeed = 0.08f; 11 public Texture aimImage; 12 //大键盘wsad控制人物移动 13 void moveBigKeyboard() 14 { 15 if (Input.GetKey("a")) 16 { 17 transform.Translate(0, 0, 1 * moveSpeed); 18 } 19 else if (Input.GetKey("d")) 20 { 21 transform.Translate(0, 0, -1 * moveSpeed); 22 } 23 else if (Input.GetKey("s")) 24 { 25 transform.Translate(-1 * moveSpeed, 0, 0); 26 } 27 else if (Input.GetKey("w")) 28 { 29 transform.Translate(1 * moveSpeed, 0, 0); 30 } 31 } 32 //鼠标左右移动控制前进方向 33 void moveMouse() 34 { 35 transform.Rotate(0 , Input.GetAxis("Mouse X") * rotateSpeed, 0); 36 } 37 void OnGUI() 38 { 39 Screen.lockCursor = true; 40 //绘制准心 41 //Rect rect = new Rect(Input.mousePosition.x - (aimImage.width >> 1), 42 //Screen.height - Input.mousePosition.y - (aimImage.height >> 1), 43 //aimImage.width, aimImage.height); 44 //如果要加y轴,可以加 45 Rect aimRect = new Rect(Input.mousePosition.x - 10, -Input.mousePosition.y + 310, 20, 20); 46 GUI.DrawTexture(aimRect, aimImage); 47 48 } 49 void FixedUpdate() 50 { 51 moveBigKeyboard(); 52 moveMouse(); 53 } 54 55 }
然后是技能脚本:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class skill : MonoBehaviour 6 { 7 8 9 //【地爆天星】z键触发,六个小球出现,小球依次消失 10 public GameObject ChibukaTensei; 11 void skillChibukaTensei() 12 { 13 if (Input.GetKey("z")) 14 { 15 GameObject CT1, CT2, CT3, CT4, CT5, CT6; 16 CT1 = Instantiate(ChibukaTensei, transform.TransformPoint(10, 0, 0), ChibukaTensei.transform.rotation); 17 CT2 = Instantiate(ChibukaTensei, transform.TransformPoint(14, 0, -5), ChibukaTensei.transform.rotation); 18 CT6 = Instantiate(ChibukaTensei, transform.TransformPoint(14, 0, 5), ChibukaTensei.transform.rotation); 19 CT3 = Instantiate(ChibukaTensei, transform.TransformPoint(18, 0, -5), ChibukaTensei.transform.rotation); 20 CT5 = Instantiate(ChibukaTensei, transform.TransformPoint(18, 0, 5), ChibukaTensei.transform.rotation); 21 CT4 = Instantiate(ChibukaTensei, transform.TransformPoint(22, 0, 0), ChibukaTensei.transform.rotation); 22 Destroy(CT1, 1); 23 Destroy(CT2, 2); 24 Destroy(CT3, 3); 25 Destroy(CT4, 4); 26 Destroy(CT5, 5); 27 Destroy(CT6, 6); 28 } 29 } 30 31 32 33 //【Fireball】双锤普攻,鼠标左键施法准备火球,满足【锤头=红色+火球集气到最大】的要求后,松开左键释放火球;右键集气 34 public GameObject Fireball;//实例化的对象 35 int cd = 0;//【Fireball】集气计数器。满50,才可能火球施放成功 36 int scale = 0;//【Fireball】释放计数器。释放次数满50,火球才能施放成功 37 public Camera aim;//瞄准摄像头 38 void skillFireball() 39 { 40 41 GameObject FB; 42 //松开左键时 43 if (Input.GetMouseButtonUp(0)) 44 { 45 //锤头为红色,且火球最大时,发射火球 46 if (Color.red == GameObject.Find("top1").GetComponent<Renderer>().material.color & scale == 50) 47 { 48 //发射成功后锤头变白 49 GameObject.Find("top1").GetComponent<Renderer>().material.color = Color.white; 50 GameObject.Find("top2").GetComponent<Renderer>().material.color = Color.white; 51 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 52 //先把火球缩小,然后随着scale值逐渐变大 53 FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale); 54 //这是在给火球确认射击方向。如果这个放FixedUP下面,就会导致火球飞出去后,前进方向会跟着镜头变 55 FB.transform.LookAt(aim.transform.forward * 1000); 56 //为了营造【螺旋丸】的效果,预制体rigidbody里的FreezeRotation都要解锁;但在成功发射火球时要锁上,不然就会乱飞。 57 FB.GetComponent<Rigidbody>().freezeRotation = true; 58 Debug.Log("发射火球成功"); 59 } 60 61 //其它情况,火球大小变为0 62 else 63 { 64 scale = 0; 65 } 66 67 } 68 //左键施法 69 else if (Input.GetMouseButton(0)) 70 { 71 72 //点击右键时左键一直在按==左右键一直按 73 if (Input.GetMouseButton(1)) 74 { 75 //实例化一个小火球 76 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 77 FB.transform.localScale = new Vector3(0.275f, 0.25f, 0.175f); 78 //火球变成脚本附着物的子物体 79 FB.transform.parent = this.transform; 80 //我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的 81 Destroy(FB, 0.01f); 82 } 83 else if (cd == 0) 84 { 85 //实例化火球 86 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 87 //火球变成脚本附着物的子物体 88 FB.transform.parent = this.transform; 89 FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale); 90 Destroy(FB, 0.1f); 91 } 92 else if (cd < 0) 93 { 94 Debug.Log("cd<0"); 95 } 96 else if (cd > 0) 97 { 98 cd -= 1; 99 scale += 1; 100 GameObject.Find("Hammer1").transform.Rotate(0, 0, -0.5f); 101 //实例化火球 102 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 103 //火球变成脚本附着物的子物体 104 FB.transform.parent = this.transform; 105 //先把火球缩小,然后随着scale值逐渐变大 106 FB.transform.localScale = new Vector3(0.0275f * scale, 0.025f * scale, 0.0175f * scale); 107 //我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为物体有体积同一个地方出现会顶前面出现的乱飞 108 Destroy(FB, 0.1f); 109 } 110 else if (cd == 50) 111 { 112 //什么都不发生 113 } 114 115 116 } 117 //右键集气 118 else if (Input.GetMouseButton(1)) 119 { 120 //右键一直在按时点击左键 121 if (Input.GetMouseButton(0)) 122 { 123 //实例化一个小火球 124 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 125 FB.transform.localScale = new Vector3(0.275f, 0.25f, 0.175f); 126 //火球变成脚本附着物的子物体 127 FB.transform.parent = this.transform; 128 //我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的 129 Destroy(FB, 0.01f); 130 } 131 //cd不能大于50 132 else if (cd > 50) 133 { 134 cd = 50; 135 } 136 //集气满时,锤头变红,scale=0 137 else if (cd == 50) 138 { 139 scale = 0; 140 GameObject.Find("top1").GetComponent<Renderer>().material.color = Color.red; 141 GameObject.Find("top2").GetComponent<Renderer>().material.color = Color.red; 142 } 143 else if(cd >= 0) 144 { 145 cd += 1; 146 GameObject.Find("Hammer1").transform.Rotate(0, 0, 0.5f); 147 } 148 else if (cd < 0) 149 { 150 Debug.Log("cd<0"); 151 } 152 153 154 } 155 //左右键一起按 156 157 else if (Input.GetMouseButton(0) & Input.GetMouseButton(1)) 158 { 159 //实例化一个小火球 160 FB = Instantiate(Fireball, transform.TransformPoint(2.578875f, 2, 0.01999918f), Fireball.transform.rotation); 161 FB.transform.localScale = new Vector3(1f , 1f , 1f ); 162 //火球变成脚本附着物的子物体 163 FB.transform.parent = this.transform; 164 //我tmd也不知道为什么球会自己在那疯狂转....但是效果很像螺旋丸- -,所以就将错就错吧...我怀疑是因为【物体有体积,同一个地方出现会顶前面出现的乱飞】导致的 165 Destroy(FB, 0.01f); 166 Debug.Log("左右键一起按"); 167 } 168 169 170 171 //松开左键时右键仍在按 172 else if (Input.GetMouseButtonUp(0)) 173 { 174 scale = 0; 175 } 176 } 177 178 179 void Update() 180 { 181 skillChibukaTensei(); 182 //【Fireball】如果不放这,鼠标松开这个事件有时候会检测不到,造成技能释放失败 183 skillFireball(); 184 //只有火球发射成功了,下面的代码才能执行一次。注意,是一次!火球没成功的帧,下面是无法执行的,因为没成功就不会有长时间存在的Fireball(Clone)对象(临时的那种,是0.01秒消失,基本就是一帧不到就没了) 185 GameObject.Find("Fireball(Clone)").transform.Rotate(0,0,10); 186 GameObject.Find("Fireball(Clone)").transform.Translate(0, 0, 0.2f); 187 Destroy(GameObject.Find("Fireball(Clone)"),3); 188 } 189 void FixedUpdate() 190 { 191 192 193 194 } 195 }
注意这个技能脚本会有报错,但这是正常的
我还是第一次写出一个【报错】但是正常的程序。
之所以报错,是因为void Update()函数里的Fireball(Clone)是只有【火球释放成功】才会出现的物体,所以代码里你是找不到这个物体的,就报错了
但恰恰就是这样才能实现这个【火球成功释放往前射击】的效果。
我自己目前没有能力让程序不报错也能实现这一点....所以先这样吧
【fireball】这个技能的脚本花掉了我一天的时间
主要问题是逻辑上,一开始我是按玩家可能出现的操作进行分类写多个if来判断
后来越写越乱....我冷静了一下,发现这个角度去写不对,肯定有一个角度更便捷也更准确
后来我想到了,从我提供给玩家的按键出发即可:
要么是左键,要么是右键。剩下的可能结果,都是出自这两个中,把if丢进这两个大类里就好了!
虽然改进了角度,但还是需要实际测试,才慢慢完善了后面的多个else if内容。
肯定还有疏漏之处,毕竟这个技能是整个demo的核心,我还要继续完善这个技能脚本的。
wuduojia