#前言



哈喽哈喽,我来了。



本文将结合C#在Unity中的应用讲解,代码编辑器使用Visual Studio。讲解内容来自《C#高级编程 第10版》和我的理解,如果有错希望大佬指出(骂我,不要客气!)。



下面是《C#高级编程 第10版》的pdf文件分享




#正文

#变量

  • 变量的基础介绍
int
     
      a
     
     ;
     
      
     
     //其中a就是变量。int是数据类型,代表a用于存放整数。
     
     
a 
     
     =
     
      
     
     0
     
     ;
     
      
     
     //a的初值被赋值为0。初值:初次被赋值的值。
     
     
a 
     
     =
     
      
     
     1
     
     ;
     
      
     
     //此时a的指变为1。变量变量,因为可以变所以是变量。
     
     
a 
     
     =
     
      a 
     
     -
     
      
     
     1
     
     ;
     
      
     
     //a的值变为0。因为之前a的值为1,所以a - 1就相当于 1 - 1。



变量即变化的量,用于存储数据,方便之后使用。



变量就好比一个只能放一个物品的篮子,每次放入物体后就需要拿出前面的物体,因为这个篮子只能放一个物品。在使用变量时就相当于直接把这个篮子给它丢上去,里面装的啥,这次使用的时候就相当于啥。



变量使用前必须要初始化,不然要不会报错,要不答案会不和你的心意。(你都定义变量了,为什么不赋值!)



  • 变量的作用域
Class A 
     
     //这是类,我们之后在讲哈
     
     

     
     {
     
     
    
     
     int
     
      a
     
     ;
     
      
     
     //变量a的作用域是整个A这个类,所有A内的函数都可以给它赋值和使用它。
     
     

    
     
     void
     
      
     
     Fun
     
     (
     
     )
     
      
     
     //这是函数,我们也之后在讲哈
     
     
   
     
     {
     
     
        
     
     int
     
      b
     
     ;
     
      
     
     //变量b的作用域是整个函数中,函数以外的地方不能使用它。
     
     
    
     
     }
     
     //函数以花括号为结尾
     
     

    
     
     //这里使用b的话就会报错
     
     

     
     }



在同一作用域里,不能重复声明一个变量(也就是不能有两个名字一模一样的变量)。



还是以装东西的物品举例吧,超市的推车(只能装一个东西的推车!好小的推车),你在超市里拿了,只能在超市中使用。变量也是同理,你在类里面声明了,那么你就只能在类里面使用,外面就不行。



原则上来说,尽可能不使用相同命名的变量,但不同作用域里是可以声明和外部相同名字的变量的(使用时,使用你命名的局部变量),比如你在继承了MonoBehaviour类(Unity内代码都继承自这个类)里面定义一个gameObject,可以正常使用这个新的变量,但编辑器会给你来根黄色波浪线提示。还是要避免这种情况!



  • 常量
const
     
      
     
     int
     
      a 
     
     =
     
      
     
     100
     
     ;
     
      
     
     //const是关键字,后面声明的不再是变量,而是一个常量。a之后就只能为100了。



通过以上方式声明的常量,就可以理解为一个不能变化的变量,常量是在生命周期(声明到销毁的过程中的时间内)里值不会发送变化的变量。常量在声明时就需要赋值,不然会报错。(常量了解一下就好,很少去声明一个常量的。)



其他的,比如100,0.1f(f表示浮点数)之类的有个定值的,不能改变的,也都是常量。



#数据类型

  • 值类型和引用类型

C#的数据类型分为值类型和引用类型:值类型存储在堆栈中(堆栈以后会讲哦),而引用类型存储在托管堆上。



我们接下来要讲的基础数据类型(int,float)这些都是值类型哦,虽然string是引用类型,但使用方法和值类型没什么区别。新人读者不需要太纠结于值类型和引用类型,在之后讲到类之后,我会再次详细讲一遍值类型和引用类型的区别和使用方法。



关于string是引用类型的证明,大家可以参考下面这篇文章





  • 基础数据类型

首先是整型(下图是截取自《C#高级编程 第10版》):




unity引用公共变量_字符串

平时都是使用int类型哦,但要注意你会使用到的变量范围,如果超过了最大值或者低于最小值,记得要换成long。


然后是浮点类型(下图是截取自《C#高级编程 第10版》):


unity引用公共变量_学习_02

其实浮点数也就是我们说的小数,只是说法不一样罢了,以后大家听到程序员说浮点数要一下子反应过来哦。一般开发中使用float就够了。


因为二进制存储小数会产生误差,所以大家使用浮点数计算要注意哦,但也无需太在意,一般项目没这么高要求,如果有要求一开始就会说的。(考大家一下,现在大家都知道了浮点数用于计算有误差,但银行的存取过程中可不允许产生误差哦,大家想想银行一般是怎么处理的呢,有兴趣的可以百度看看。)


decimal类型是精度更高的浮点数,书中介绍说是一种专用类型进行财务计算的。我没有使用过,大家以后需要进行这类计算的时候可以来看一下这个类型,这个类型并不是基础类型。


float
     
      a 
     
     =
     
      
     
     1.0f
     
     ;
     
      
     
     //其中的f表示该


bool类型(下图是截取自《C#高级编程 第10版》):


unity引用公共变量_学习_03

bool类型就两个值哦,一个是true,一个是false。(C#里面无法将整数类型隐式转换为bool类型,在别的语言比如Java里面是可以的,转换时0表示false,非0为true。)


bool
     
      a 
     
     =
     
      
     
     true
     
     ;
     
     

     
     bool
     
      b 
     
     =
     
      
     
     false
     
     ;


字符类型:


用于存储单个字符的值。(这个虽然是基本数据类型,但基本用不到,除了你学校的考试,基本上没必要写。)


char
     
      a 
     
     =
     
      
     
     'A'
     
     ;
  • 预定义的引用类型

object类型


根类型,其他类型都是从它派生出来的(包括值类型)。这是个概念性的类型,object类是所有类的最上级,在封装类的时候很可能用得上。


string类型


string类型中放的是字符串,也就是文字啦。这里有一个重要的知识:string类型的字符串是无法改变的,每次你给string类赋值的时候,其实就是生成了一个新的字符串,然后放到字符串变量里(引用的),原来的字符串就等待被毁掉了。


string
     
      a 
     
     =
     
      
     
     "这里是中文!"
     
     ;
     
     

     
     string
     
      b 
     
     =
     
      
     
     "lalalalal"
     
     ;
     
       
     
     //也可以放英文,所有打的出来的字符都可以哦,其中还有转义字符,会变成相应的效果,有兴趣百度吧。
     
     
a 
     
     =
     
      a 
     
     +
     
      b
     
     ;
     
      
     
     //a的原来的字符串直接被丢掉,生成一个新的字符串,放入变量中。

#程序流控制


众所周知,正常来说一个程序段里面的代码,应该是从上往下的,执行完上一句然后执行下一句,但程序流控制语句会有些例外哦。


  • 条件语句

也叫if语句,用if...else...的结构,直接看代码,代码会更清楚。


bool
     
      a 
     
     =
     
      
     
     true
     
     ;
     
     

     
     if
     
     (
     
     a
     
     )
     
     //括号里的只能是bool类型。意思是说,如果这个判断是对的,执行下面的语句。
     
     

     
     {
     
     

     
     //当a为true时,执行这个语句块的代码,然后跳过后面所有的判断
     
     

     
     }
     
     

     
     else
     
      
     
     if
     
     (
     
     a
     
     )
     
     //括号里还是只能放bool类型,而且else if可以写无数个。意思就像是说,如果不符合上一条判断就判断它是不是符合这个判断。
     
     

     
     {
     
     

     
     //上面是true就执行这个代码
     
     

     
     }
     
     

     
     else
     
      
     
     //意思是,如果不符合上面任何一种判断,就直接执行下面语句块中的代码。
     
     

     
     {
     
     

     
     }
  • switch语句

还是直接上代码。


switch
      
      (
      
      a
      
      )
      
       
      
      //a可以是整型变量和字符串(string变量),还有字符变量(char)
      
      

      
      {
      
      
    
      
      case
      
       
      
      1
      
      :
      
       
      
      //意思是,判断a是不是等于1,如果等于1就执行下面的内容。
      
      
        
      
      //执行的代码
      
      
        
      
      break
      
      ;
      
       
      
      //意思是跳出循环语句,也就是switch语句块,不执行下面的语句了。
      
      
    
      
      case
      
       
      
      2
      
      :
      
      
        
      
      //执行的代码
      
      
        
      
      break
      
      ;
      
       
    ……

    
      
      default
      
      :
      
       
      
      //当以上判断都不正确时,调用下面的代码。
      
      
       
      
      //执行的代码
      
      
       
      
      break
      
      ;
      
      

      
      }
     
     

     
     
      
      switch
      
      (
      
      a
      
      )
      
       
      
      //a可以是整型变量和字符串(string变量),还有字符变量(char)
      
      

      
      {
      
      
    
      
      case
      
       
      
      1
      
      :
      
       
      
      //意思是,判断a是不是等于1,如果等于1就执行下面的内容。
      
      
        
      
      //执行的代码
      
      
        
      
      break
      
      ;
      
       
      
      //意思是跳出循环语句,也就是switch语句块,不执行下面的语句了。
      
      
    
      
      case
      
       
      
      2
      
      :
      
      
        
      
      //执行的代码
      
      
        
      
      break
      
      ;
      
       
    ……

    
      
      default
      
      :
      
       
      
      //当以上判断都不正确时,调用下面的代码。
      
      
       
      
      //执行的代码
      
      
       
      
      break
      
      ;
      
      

      
      }
  • for循环

多说无益,直接看代码,虽然想这么说,但还是先看图吧,更加直观些。


unity引用公共变量_学习_04

其中的i 的意思可以粗略的理解为i = i + 1;(还有个 i;本质上都是一样的,让 i 加 1 但执行时间不一样,平时写代码一般都是写一个i++就得了,只有考试才会问你这两个有啥区别之类的,如果有需要就百度看看吧,很简单的。)


还有诸如 i += 1;这样的代码,其实这个+=就想当于使用原本的变量加上某个数值,在赋值给原来的变量,是一种简写,当然,这与i = i + 1;是有区别的,但在平时项目中无需关心,也就是个知识扩展的感觉罢了,有兴趣就百度吧。


for
     
     (
     
     int
     
      i
     
     =
     
     0
     
     ;
     
      i 
     
     <
     
      
     
     100
     
     ;
     
      i
     
     ++
     
     )
     
     

     
     {
     
     

     
     //执行的代码
     
     

     
     }


以上代码就表示执行语句块的内容100次,逻辑参考上面的图。新人的话可能有些懵逼,为什么要执行一个语句块一百次呀!这些疑问很快就能在后面的学习里找到答案哦。


  • while循环

先看逻辑:


unity引用公共变量_字符串_05

再看代码


while
     
     (
     
     a
     
     )
     
     //a代表bool类型,不一定是变量。1 == 1也是逻辑判断true,这样也可以
     
     

     
     {
     
     
    
     
     //执行语句
     
     

     
     }


不同于for语句一般有固定的次数,while语句只要a的值一直为true就可以一直循环。不过还是要在语句块中写下可以跳出循环的条件,使用break;或者使a变为false,死循环程序是会崩掉的。


  • do...while

上图!


unity引用公共变量_学习_06

上代码!


do
     
     

     
     {
     
     

     
     //执行的代码
     
     

     
     }
     
     while
     
     (
     
     a
     
     )
     
     ;
     
       
     
     //注意这个分号,要记得写do


从上面的流程图可以看出来,do...while和while语句很像,就是在开始前多执行了一次。因为do...while的语句后面才执行判断,所以一定会被执行一次。(一般用while就解决了,do...while的登场率不算高吧。)


  • foreach循环

接下来的解释对于新人来说不太友好了。foreach循环用于循环数组,集合类这些组合类型的情况,每次循环取出一个其中的一个子物体,进行操作,循环次数是集合中的物体数量。(能用foreach的场合都可以用for解决,而且foreach的性能消耗比for更高,但一般也不会考虑这点性能啦,大家想用还是可以放心用。)


foreach
     
     (
     
     int
     
      temp 
     
     in
     
      intarray
     
     )
     
       
     
     //intarray是数组哦。
     
     

     
     {
     
     

     
     //执行的代码
     
     

     
     }


数组,集合以后都会讲的,听不懂的也没关系,后面就懂了。


  • 跳转语句

1.goto语句


其实我在思考要不要把这个加进来的,这个goto语句可以说是臭名昭著,几乎没人使用它,使用可能会引发各种各样的问题。我就不详讲了,只是跟大家提一嘴,让大家知道有这么个不受待见的goto语句。


2.break语句


之前的代码里就使用过这个语句,这个语句用于跳出当前循环,是直接跳出循环,直接执行后面的语句。


3.continue语句


用法和break语句一样,直接一句


continue
     
     ;


这样就可以了。


意思是跳过本次循环,进行下一次循环。它并不像是break一样直接跳出全部循环,而且只有当前这次循环后面的内容被跳过,进行下一次的循环。


4.return语句


这个我们留到讲方法和类的时候讲,现在讲需要扩展的内容就太多了。