zoukankan      html  css  js  c++  java
  • 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的核心,我还要继续完善这个技能脚本的。

  • 相关阅读:
    漫谈程序员系列:咦,你也在混日子啊
    JVM加载class文件的原理机制
    maven编译的时候排除junit测试类
    mysql之——存储过程 + 游标 + 事务
    JSP页面之${fn:}内置函数
    生成24位字符串ID__IdGenerator.java
    oracle创建用户,表空间,虚拟路径,导入dbf
    eclipse手动修改默认工作空间
    资源
    http协议发送header+body+json及接收解析
  • 原文地址:https://www.cnblogs.com/wuduojia/p/9427563.html
Copyright © 2011-2022 走看看