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的核心,我还要继续完善这个技能脚本的。

原文地址:https://www.cnblogs.com/wuduojia/p/9427563.html