从零开始的unity2017笔记【基本代码用法,追加中..】

零、头文件

using UnityEngine.SceneManagement;(场景切换要用)
using UnityEngine.UI;(对ui对象进行操作时要用)

一、写在start()前面的

public(公开的)  命名参数时在其前面加m_则在组件上显示的参数名不会带m_,会自动首字母大写,这种方法更能让命名对象不会冲突,而且更明显这是命名的对象。(因此推荐在public上命名的参数都加m_)(用public声明的参数都可以直接把对象拖进脚本里)

protected(受保护的,只有当前类的成员与继承该类的类才能访问)

private (完全私有的,只有当前类中的成员能访问到)

(下面例子都属常见声明方式public和protected)

public Transform m_xxx;(一般用来声明指向Hierarchy里面的某一对象,指向当前对象的transform属性,而这个属性包含的是对象的位置信息,这个属性是gameobject的其中一个组件

public GameObject m_xxx;(指向当前游戏对象,指向对象的全部组件

private Vector3 pos3;(设置一个pos变量,保存的是x y z的坐标值

private Vector2 pos2;(设置一个pos变量,保存的是x y的坐标值,可以将pos3的值赋予给pos2,会填入pos3里面的x,y值

public XXXXXXXX m_?(里面的XXXXXX是根据你所需什么对象或者组件或者脚本的性质类型而定

public static m_?(加了static的参数就可以被其他脚本使用这个参数而不用再创建)

声音方面:

public AudioClip m_yyy;(用来声明音乐文件

protected AudioSource m_audio;(声明使用声音源控件,下面都以m_audio为例子

动画方面:

public Animator anim;(一般都这样用anim来声明动画组件

物理方面:

private CapsuleCollider col;(一般这样来用col命名去声明碰撞体属性,以控制高度,宽度等等,碰撞体类型声明根据不同设置变化

其他:

void Awake()(这个函数将在start前调用

二、写在start()里面的

m_xxx.gameObject.SetActive(false);隐藏对应对象/可改为显示对应对象,这种方式应用于用transform声明的对象,因为transform只声明了该对象的位置属性,隐藏对象是对整个对象而言

m_xxx=transform.Find("xxx").gameObject;

m_xxx.SetActive(false);隐藏对应对象/可改为显示对应对象,这种方式应用于用GameObject声明的对象

vector3 pos = (某对象).transform.position;用pos保存当前对象的position的xyz坐标值,可以改成roation来保存旋转角度坐标值

GetComponent<AudioSource>();(要用什么组件的时候就要用GetComponent<组件名>这个函数去获取)

声音方面:

m_audio = this.GetComponent<AudioSource>();将m_audio指向当前对象的音源组件(必须给当前组件加上声音组件))

m_audio.clip=m_yyy;指定音效文件

m_audio.loop=true;设定是否循环播放该文件

动画方面:

物理方面:

col = GetComponent();将col指向当前对象里面的碰撞体

其他方面:

Invoke("函数名", float时间);【在指定时间后调用所填的函数,单位是秒】

InvokeRepeating("函数名", float时间1,float时间2);InvokeRepeating()这个函数用于在指定时间1后调用这个函数,然后每隔时间2重复调用这个函数】

三、可以在合适地方用的

m_xxx.this.gameobject.getcomponent<AudioSource>().enabled=false;(这种方法可以实现对音源组件的隐藏和显示,也可以对如碰撞体、音源组件、脚本操作。true就是显示,false就是隐藏)

SceneManager.LoadScene("xxscene");(场景切换,需要头文件支持

Application.Quit();退出游戏程序,打了包才会生效

Debug.Log("这里被成功调用");此代码被执行就会在控制台出现想说的内容,可以是参数值,自己设置的字符串等

printf("xxx");同上也是在控制台出现输出的东西

Instantiate(要复制的对象, 位置坐标变量.position, 方向坐标变量.rotation);复制对象的函数,复制子弹对象,场景相同物体生成什么的

vector3 pos调用时则是pos.x、pos.y、pos.z来用(vocter2 pos等的也同理

this.transform.position = pos;(与此同时也可以这样来给pos赋新值后再改变当前对象的位置position改为rotation就是改变对象方向)

Destroy(this.gameObject,time);这个函数用于删除某对象,time可有可无,有time的时候就是在time时间结束后自动删除对象,单位是秒

UnityEngine.Random.Range(2, 5);这个函数用于产生随机数,括号里是随机数上下限。这里的可以有的值是2、3、4的整数,可以设置负数产生正负随机数

Time.timeScale = 1;(这个可以用来控制游戏暂停,0为暂停,1为运行(默认为1)。这是最基本的暂停实现方式,虽然在这种情况下音效还可以继续播放,但是一些利用time.timescale进行运动的物体会保持暂停前的运动状态。比如怪物利用time.timescale进行随机运动时暂停,他会变成保持原有的运动方向、速度继续往前走。还有其他更好的暂停方法)

要是我要在当前对象使用当前的脚本去控制其他对象里面某个子对象的组件怎么办?

那就要:

public transform m_xxx;//指向某个对象

private XXX(某个组件的类型) m_yyy;//声明那个组件的类型参数

在start()中:

m_yyy=m_xxx.Find("那个对象的子对象名").GetComponent();

m_yyy.zzz(那个组件里面的某些参数值)=进行修改等等操作;

声音方面:

m_audio.Play();播放音效,m_audio需要先被指定一个音效clip

m_audio.PlayOneShot(m_yyy);第二种播放音效的方法,不用事先给m_audio指定,只播放一次

动画方面:

anim.SetBool("death", false);动画机中的动画触发条件,这里是bool型,还有int、trigger、float型等,在动画机处自己设置

物理方面:

col.height = 2.1f;这里设置碰撞体的高度为2.1,同理也可以用width设置宽度

this.m_xxx.Translate(this.m_xxx.forward * Time.deltaTime * (速度参数), Space.World);m_xxx必须拥有transform属性,才能使用translate等位置变化函数!forward是往前移动,time.deltatime是对象刷新一次的时间,这里就是说该对象每刷新一次(可能和刷新帧有关)就往前移动,移动速度和“速度参数”相关,自己设置,Space.World则应该是表示是在大地图空间里面移动,应该还有一种方法是让他在摄像机位置里移动)

this.m_xxx.RotateAround(this.m_xxx.position, new Vector3(0, 1, 0), Time.deltaTime * (角度参数));m_xxx必须拥有transform属性,才能使用translate等位置变化函数!让对象旋转,主要设置角度参数来改变转动速度和方向,Vector3(x轴, y轴, z轴))

给对象位置属性赋值要注意的东西:

transform.localPositiontransform.localScale都是直接赋值三元数(vector3),而给旋转角度赋值需要用 
方法一: 
xxx.transform.localEulerAngles = new Vector3 (0.0f,0.0f,0.0f); 
方法二: 
xxx.transform.rotation=Quaternion.Euler(0.0f,0.0f,0.0f);

设备输入处理:

Input.GetMouseButtonDown(0);(检测鼠标按下哪个键;0左,1右,2中键)

Input.GetButtonDown("jump");(这种方法是在【edit】-【project setting】-【input】里面设定好各种基本按键的检测方法。比如我在里面命名一个“jump”按键,设定按下空格生效。因此在这里检测时检测这个“jump”就等于检测了空格space键)

Input.GetAxis("Horizontal");(同上,检测到Horizontal为名的按键按下后返回的是在该设置里面的【axis】里面的值,一般用来调整移动速度什么的)

Input.GetKeyDown(KeyCode.Q);(而这种方法是直接检测你按下键盘的哪个按键,与上面的有区别,此外在下一次按下这个键之前这个输入只会响应一次)

Input.GetKey(KeyCode.Q);(这种方法也是检测按下哪个键,不过这在你松开按键前却是不断响应这个输入,也就是说:QQQQQQQQQQQQQQQQQQ.....)

同理上面有down的语句也有对应的up语句,GetKeyUp(),顾名思义是松开按键的时候触发

四、一般要写在update()函数里的

m_xxx.Translate(0,1,0,Space.self));m_xxx必须拥有transform属性,才能使用translate等位置变换函数!表示某对象在y轴上按1的速度移动,而后面的参数“space.self”可有可无,若没有和设置为space.self则表示为以当前移动对象自身为参照进行移动,若设为space.world则是以世界坐标进行参照移动)
m_xxx.Rotate(30, 0, 0,space.self);m_xxx必须拥有transform属性,才能使用translate等位置变换函数!表示某对象按x轴以30的速度旋转,“space.self”同上)

五、一些常用函数

void OnTriggerEnter(Collider other)(检测本对象的碰撞体是否与其他碰撞体相交,相交就函数生效)

2D方面的函数:

void OnCollisionStay2D(Collision2D col)(该脚本的当前对象和其他碰撞体接触时生效)

void OnCollisionEnter2D(Collision2D coll)(该脚本的当前对象与其他碰撞体相交时触发)

void OnCollisionExit2D(Collision2D col)(该脚本的当前对象不和其他碰撞体接触时生效)

void OnTriggerStay2D(Collider2D coll)(该脚本的当前对象和其他碰撞体接触时生效并且当前碰撞体设置了“is trigger”)

void OnTriggerEnter2D(Collider2D coll)(该脚本的当前对象和其他碰撞体相交时生效并且当前碰撞体设置了“is trigger”)

void OnTriggerExit2D(Collider2D coll)(该脚本的当前对象不和其他碰撞体接触时生效并且当前碰撞体设置了“is trigger”)

PS:如何控制与特定的碰撞体碰撞才发生效果?通过设置目标对象或者被碰对象的tag实现(也可以用layer设置可碰撞层与不可碰撞层),下面假设我要让当前物体与标签(tag)为enemy的对象碰撞才发生效果。

void OnTriggerEnter2D(Collider2D coll){

if(coll.tag==“enemy”)

printf“碰到敌人了”

}【这种情况就只有碰到enemy标签的对象才会输出结果,否则什么事都不会发生】

六、小总结

*其他脚本的变量没有设置成static时调用其他脚本的变量需要【脚本名.instance.变量】声明,其中instance是在该脚本中先指向自己,如:
      public static behavior instance;
      在star函数中:
      instance = this;

 * 若是static变量调用直接【脚本名.变量】

想要在手机上调试unity做的手机游戏可以下载unity remote APP。并且在unity程序中的Edit->Project Settings->Editor中的unity remote中的device调为Any Android device。这样用usb线和手机连接就能把电脑中运行的unity游戏画面投影到手机上,并且可以用手机手势触摸控制游戏。

(2019/6/30作了更新)

你可能感兴趣的:(从零开始的unity2017笔记【基本代码用法,追加中..】)