WHCSRL 技术网

Unity 知识点(常用核心类)_m0

 一:Transform

        Transform组件是Unity3D的重点之一,主要由于控制物体的旋转、移动、缩放。

  1. /*
  2. 成员变量:
  3. position:在世界空间坐标transform的位置。
  4. localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同Transform.position
  5. eulerAngles:世界坐标系中的旋转(欧拉角)。
  6. localEulerAngles:相对于父级的变换旋转角度。
  7. right:世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)
  8. up:世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。)
  9. forward:世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)
  10. rotation:世界坐标系中的旋转(四元数)。
  11. localRotation:相对于父级的变换旋转角度。
  12. localScale:相对于父级的缩放比例。
  13. parent:父对象Transform组件。
  14. worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。
  15. localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。
  16. root:对象层级关系中的根对象的Transform组件。
  17. childCount:子对象数量。
  18. lossyScale:全局缩放比例(只读)。
  19. /*
  20. transform.position=new Vector3(0,0,3);//位置移动
  21. transform.rotation=Quaternion.Eular(0,45,0);//位置旋转 Y轴旋转45度
  22. transform.localScale=new Vector3(2,2,1); //缩放
  23. //成员方法
  24. transform.Translate(0,0,3);//位置移动 =(Vector3.forward*3); =(new Vector3(0,0,3))向前移动
  25. transform.Rotate(0,45,0);//围绕Y轴旋转45度

二:向量(Vector3)

既有大小又有方向的量叫做向量。在空间中,向量用一段有方向的线段来表示。可用于描述具有大小和方向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察方向、刚体受到的力等都是向量。

 

 三:GameObject

GameObject和gameObject的区别:

        GameObject是游戏对象类的基类

        gameObject是脚本挂载的对象

方法:

Find(、FindWithTagO、FindGameObjectsWithTagO等

1)通过名称来查找:
GameObject player = new GameObject("Player");GameObject go=Gameobject.FinPlayer”);
2)通过tag 标签获取单个游戏对象:
GameObject go=GameObject.FindWithTag(Player”);
GameObject go=GameObject.FindGameObjectWithTag '(Player”);

3)通过游戏标签获取多组游戏对象:
GameObject[]go=GameObject.FindGameObjectsWithTag Player");组件引用函数:
GetComponent
得到组件
GetComponents
得到组件列表(用于多个同类型组件的时候)
GetComponentInChildren得到对象或对象子物体上的组件
如:
ScriptName other=GameObject.GetComponent<ScriptName>():/在对象上添加脚本print(other.name);//可以通过对象引用脚本中的名字
 

四:Time

Time.time:表示从游戏开始到现在的时间,会随着游戏的暂停而停止计算。

Time.deltaTime:表示从上一帧到当前帧的时间,以秒为单位。

Time.timeScale:时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。

  1. //案例1:用deltaTime控制对象移动
  2. public GameObject cube;
  3. float speed = 3f;
  4. void Update ()
  5. {
  6. cube.transform.Translate(Vector3.forward * Time.deltaTime * speed);
  7. }

 

五:克隆游戏对象

//在预设体的位置克隆游戏对象

GameObject go1=Instantiate(cube);

//在固定位置克隆游戏对象

//Quaternion.identity 游戏对象不旋转:Quaternion(0,0,0,0)

GameObject go2 =Instantiate(cube,new Vector3(0,0,5),Quaternion.identity);

六:销毁游戏对象

Destroy销毁场景中的物体但是内存还存在,或一段时间没有再次被使用,才会销毁并且释放内存,这样避免了频繁对内存的读写操作,系统回收器会定时清理内存中没有被引用的对象,很可能有些地方你依然引用了该对象在你自己都不知道的地方,或者你忽略的地方,直接销毁会导致引用地方出现空引用的引用错误。

  1. //比如说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体
  2. ///<summary>
  3. ///脚本挂在A物体上
  4. /// <summary>
  5. public class AGameOnject: MonoBehaviour
  6. {
  7. void Start ()
  8. {
  9. for (int i = 0; i < transform.childCount; i++)
  10. {
  11. Destroy (transform.GetChild (i).gameObject);
  12. }
  13. }
  14. }

Destroy(go1);    //直接销毁对象go1

Destroy(go2,3);   //停3秒后销毁对象go2

七:查找游戏对象

通过名称来查找游戏对象

GameObject  cube1=GameObject.Find("Player");

GameObject  cube2=GameObject.FindWithTag("Player");

  1. //获取游戏对象有三种方法:
  2. //1.通过对象名称获取:objCube=GameObject.Find("Cube");
  3. //例如:
  4. private var objCube:GameObject;
  5. private var isCubeRoate=false;
  6. function Start () {
  7. objCube=GameObject.Find("Cube");
  8. }
  9. function Update(){
  10. if(isCubeRoate){
  11. objCube.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);
  12. }
  13. }
  14. function OnGUI(){
  15. if(GUILayout.Button("旋转",GUILayout.Height(50))){
  16. isCubeRoate=true;
  17. }
  18. }
  19. //2.通过tag标签获取单个游戏对象:objCube=GameObject.FindWithTag("Finish");
  20. //3.通过游戏标签获取多组游戏对象:objCube=GameObject.FindGameObjectsWithTag("Finish");

八:添加、获取组件

  1. //1、把Move这个脚本加到cube这个游戏对象上
  2. cube.AddComponent("Move");
  3. //2、给游戏物体添加刚体
  4. cube.AddComponent("Rigidbody");
  5. //3、给游戏物体添加球体碰撞器
  6. cube.AddComponent("BoxCollider");
  7. //1、获取脚本组件Move
  8. Move m=cube.GetComponent<Move>();
  9. //2、获取刚体组件
  10. Rigidbody r=cube.GetComponent<Rigidbody>();

九:Random

  1. float a=Random.value;                //返回0.0(包括)到1.0(包括)之间的数。
  2. int b=Random.Range(0,100) ;         //包括最小但不包括最大
  3. float c=Random.Range(0.0f,5.5f);    //包括最大和最小


 

十:Input

  1. 鼠标事件

GetMouseButton(0):按下鼠标左键不动,程序会一直运行,松开左键程序停止运行。

GetMouseButton(2):按下鼠标中键不动,程序会一直运行,松开中键程序停止运行。

GetMouseButton(1):按下鼠标右键不动,程序会一直运行,松开右键程序停止运行。

GetMouseButtonDown(0):按下鼠标左键时,程序运行一次

GetMouseButtonDown(1):按下鼠标右键时,程序运行一次

GetMouseButtonUp(2):按下鼠标中键时,程序不运行,松开中键时,程序运行一次。

if(Input.GetMouseButton(0)){

   执行语句;

}

        2.键盘事件

GetKey     当通过名称指定的按键被用户按住时返回true

GetKeyDown   当用户按下指定名称的按键时的那一帧返回true。

GetKeyUp    在用户释放给定名字的按键的那一帧返回true。

GetAxis("Horizontal")和GetAxis("Vertical")    水平轴和垂直轴

if(Input.GetKey("Down")){

   执行语句;

}

  1. //案例:用方向键或WASD键来模拟物体移动
  2. float speed = 3f;
  3. void Update () {
  4. //float h = Time.deltaTime * speed;
  5. //按下WSAD键使游戏对象前后左右移动
  6. /*if (Input.GetKey(KeyCode.A))
  7. {
  8. transform.Translate(new Vector3(-h, 0, 0));
  9. }
  10. if (Input.GetKey(KeyCode.D))
  11. {
  12. transform.Translate(new Vector3(h, 0, 0));
  13. }
  14. if (Input.GetKey(KeyCode.W))
  15. {
  16. transform.Translate(new Vector3(0, 0, h));
  17. }
  18. if (Input.GetKey(KeyCode.S))
  19. {
  20. transform.Translate(new Vector3(0, 0, -h));
  21. }*/
  22. //Horizontal
  23. //Vertical
  24. float h= Input.GetAxis("Horizontal")*Time.deltaTime*speed;
  25. float v = Input.GetAxis("Vertical") * Time.deltaTime * speed;
  26. //transform.Translate(h, 0, v);
  27. transform.Translate(new Vector3(h, 0, v));
  28. }

 

        3.自定义按钮

GetButton   根据按钮名称返回true当对应的虚拟按钮被按住时。

GetButtonDown  在给定名称的虚拟按钮被按下的那一帧返回true。

GetButtonUp    在用户释放指定名称的虚拟按钮时返回true。

  1. //案例:点击鼠标左键,给物体加一个力
  2. if (Input.GetButtonDown("Fire1"))
  3. {
  4. GameObject go = Instantiate(cube);
  5. Rigidbody r = go.GetComponent<Rigidbody>();//从预设体身上获取刚体组件
  6. r.AddForce(0,0,10000);//给预设体加力
  7. }

十一:协程

协同程序,即将主程程序运行时同时开启另一段逻辑处理来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。   

使用StartCoroutine(string methodName)可以开启一个线程。

Yield语句是一种特殊类型的Return(返回)语句,它可以确保函数在下一次被执行时,不是从头开始,而是从Yield语句处开始。

协程其实就是一个IEnumerator(迭代器)。迭代器方法运行到 yield return 语句时,会返回一个表达式并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。

  1. //案例:每隔3秒克隆一个立方体
  2. public GameObject cube;
  3. void Start () {
  4. StartCoroutine("NewCube");
  5. }
  6. IEnumerator NewCube()
  7. {
  8. while (true)
  9. {
  10. Instantiate(cube);
  11. yield return new WaitForSeconds(3f);
  12. }
  13. }

部分练习:

  1. //2、点击鼠标左键克隆一个球体子弹,5秒后子弹销毁
  2. public GameObject obj;
  3. GameObject g1;
  4. void Update () {
  5. if (Input .GetButtonDown("Fire1"))
  6. {
  7. g1=Instantiate(obj)as GameObject;
  8. }
  9. Destroy(g1,5);
  10. }
  11. //2、用yield实现游戏物体每隔3秒按X轴正方向移动2米
  12. public GameObject cube;
  13. void Start () {
  14. StartCoroutine(BB());
  15. }
  16. IEnumerator BB()
  17. {
  18. while (true)
  19. {
  20. yield return new WaitForSeconds(3f);
  21. Instantiate(cube, Vector3.right * Time.time * 2, Quaternion.identity);
  22. }
  23. }
  24. //4、用Time类实现5秒倒计时(在页面显示)
  25. public float a = 5f;
  26. void Start () {
  27. }
  28. void Update () {
  29. if (a >= 0)
  30. {
  31. print((int)a);
  32. }
  33. a -= Time.deltaTime;
  34. }
  35. //5. 按下上下左右(WSAD)键,让游戏物体前后左右移动
  36. float h = Input.GetAxis("Horizontal");
  37. float v = Input.GetAxis("Vertical");
  38. transform.Translate(h, 0, v);
  39. //6、用Random类生成一个四位验证码(不重复)
  40. void Start () {
  41. int a = Random.Range(0, 9);
  42. int b = Random.Range(0, 9);
  43. int c = Random.Range(0, 9);
  44. int d = Random.Range(0, 9);
  45. if (a!=b&&a!=c&&a!=d&&b!=c&&b !=d&&c !=d)
  46. {
  47. print(a+""+b+""+c+""+d);
  48. }
  49. }
  50. //7、脚本Test访问脚本Test2里面的内容(通过名称查找游戏对象)
  51. public class Test : MonoBehaviour {
  52. public float time = 3f;
  53. }
  54. public class Test2 : MonoBehaviour {
  55. GameObject cube;
  56. void Start() {
  57. cube = GameObject.Find("Cube");
  58. Test t = GetComponent<Test>();
  59. print(t.time);
  60. }
  61. }
  62. //8、点击鼠标左键使物体向Z轴正方向移动3米,点击鼠标右键使物体绕Y轴旋转
  63. void Update () {
  64. if (Input .GetButtonDown("Fire1"))
  65. {
  66. transform.Translate(Vector3.forward*Time.time*3);
  67. }
  68. else if (Input .GetButtonDown("Fire2"))
  69. {
  70. transform.Rotate(new Vector3(0, 1, 0));
  71. }
  72. }
  73. //9、点击鼠标左键向XZ轴对角线方向发射小球
  74. void Update () {
  75. if (Input.GetButtonDown("Fire1"))
  76. {
  77. GameObject g = Instantiate(sq);
  78. Rigidbody r = g.AddComponent<Rigidbody>();
  79. r.AddForce(1000, 0, 10000);
  80. }
  81. }
  82. //10、3秒倒计时使球体放大2倍,然后再3秒倒计时使球体变成原样
  83. time -= Time.deltaTime;
  84. if (time <= 3)
  85. {
  86. transform.localScale = new Vector3(2, 2, 2);
  87. if (time <= 0)
  88. {
  89. transform.localScale = new Vector3(1, 1, 1);
  90. }
  91. }
  92. //11、打砖墙:动态生成10行10列的墙体,点击鼠标左键向墙体发射一个球体,3秒后球体消失
  93. public GameObject cube;
  94. public GameObject sq;
  95. // Use this for initialization
  96. void Start () {
  97. for (int i = 0; i < 10; i++)
  98. {
  99. for (int j = 0; j < 10; j++)
  100. {
  101. Instantiate(cube, new Vector3(i, j, 0), Quaternion.identity);
  102. }
  103. }
  104. }
  105. // Update is called once per frame
  106. void Update () {
  107. if (Input.GetButtonDown("Fire1"))
  108. {
  109. GameObject g = Instantiate(sq);
  110. Rigidbody r = g.AddComponent<Rigidbody>();
  111. r.AddForce(0,0,10000);
  112. Destroy(sq, 3);
  113. }
  114. }
  115. //12、点击鼠标左键克隆一个子弹,然后让子弹一直向前飞
  116. if (Input.GetButtonDown("Fire1"))
  117. {
  118. GameObject g = Instantiate(sq);
  119. Rigidbody r = g.AddComponent<Rigidbody>();
  120. r.AddForce(0, 0, 100000);
  121. }
  122. //13.游戏开始3秒后,在游戏场景中不同位置(x:0--10 z:2--8)随机同时克隆3个游戏物体
  123. void Start()
  124. {
  125. StartCoroutine(AA());
  126. }
  127. IEnumerator AA()//15.
  128. {
  129. while (true)
  130. {
  131. yield return new WaitForSeconds(3f);
  132. for (int i = 0; i < 3; i++)
  133. {
  134. int x = Random.Range(0, 10);
  135. int z = Random.Range(2, 8);
  136. Instantiate(cube, new Vector3(x, 0, z), Quaternion.identity);
  137. }
  138. }
  139. }

推荐阅读