|
Unity3d初级编程
官方链接1.作为行为组件的脚本2.变量和函数3.约定和语法4.IF 语句5.循环6.作用域和访问修饰符7.Awake 和 Start8.Update 和 FixedUpdate9.矢量数学10.启用和禁用组件11.激活游戏对象12.Translate 和 Rotate13.Look At14.线性插值15.Destroy16.GetButton 和 GetKey17.GetAxis18.OnMouseDown19.GetComponent20.DeltaTime21.数据类型22.类23.Instantiate24.数组25.Invoke26.枚举27.Switch 语句
官方链接
官方链接: https://learn.unity.com/project/chu-ji-bian-cheng?uv=4.x
话不多说,直接贴代码。
1.作为行为组件的脚本
Unity 中的脚本是什么?了解作为 Unity 脚本的行为组件,以及如何创建这些脚本并将它们附加到对象。- using UnityEngine;
- using System.Collections;
- public class ExampleBehaviourScript : MonoBehaviour
- {
- void Update()
- {
- if (Input.GetKeyDown(KeyCode.R))
- {
- GetComponent<Renderer> ().material.color = Color.red;
- }
- if (Input.GetKeyDown(KeyCode.G))
- {
- GetComponent<Renderer>().material.color = Color.green;
- }
- if (Input.GetKeyDown(KeyCode.B))
- {
- GetComponent<Renderer>().material.color = Color.blue;
- }
- }
- }
复制代码 2.变量和函数
什么是变量和函数?它们如何为我们存储和处理信息?- using UnityEngine;
- using System.Collections;
- public class VariablesAndFunctions : MonoBehaviour
- {
- int myInt = 5;
-
-
- void Start ()
- {
- myInt = MultiplyByTwo(myInt);
- Debug.Log (myInt);
- }
-
-
- int MultiplyByTwo (int number)
- {
- int ret;
- ret = number * 2;
- return ret;
- }
- }
复制代码 3.约定和语法
了解编写代码的一些基本约定和语法:点运算符、分号、缩进和注释。- using UnityEngine;
- using System.Collections;
- public class BasicSyntax : MonoBehaviour
- {
- void Start ()
- {
- Debug.Log(transform.position.x);
-
- if(transform.position.y <= 5f)
- {
- Debug.Log ("I'm about to hit the ground!");
- }
- }
- }
复制代码 4.IF 语句
如何使用 IF 语句在代码中设置条件。- using UnityEngine;
- using System.Collections;
- public class IfStatements : MonoBehaviour
- {
- float coffeeTemperature = 85.0f;
- float hotLimitTemperature = 70.0f;
- float coldLimitTemperature = 40.0f;
-
- void Update ()
- {
- if(Input.GetKeyDown(KeyCode.Space))
- TemperatureTest();
-
- coffeeTemperature -= Time.deltaTime * 5f;
- }
-
-
- void TemperatureTest ()
- {
- // 如果咖啡的温度高于最热的饮用温度...
- if(coffeeTemperature > hotLimitTemperature)
- {
- // ... 执行此操作。
- print("Coffee is too hot.");
- }
- // 如果不是,但咖啡的温度低于最冷的饮用温度...
- else if(coffeeTemperature < coldLimitTemperature)
- {
- // ... 执行此操作。
- print("Coffee is too cold.");
- }
- // 如果两者都不是,则...
- else
- {
- // ... 执行此操作。
- print("Coffee is just right.");
- }
- }
- }
复制代码 5.循环
如何使用 For、While、Do-While 和 For Each 循环在代码中重复操作。
ForLoop- using UnityEngine;
- using System.Collections;
- public class ForLoop : MonoBehaviour
- {
- int numEnemies = 3;
-
-
- void Start ()
- {
- for(int i = 0; i < numEnemies; i++)
- {
- Debug.Log("Creating enemy number: " + i);
- }
- }
- }
复制代码 WhileLoop- using UnityEngine;
- using System.Collections;
- public class WhileLoop : MonoBehaviour
- {
- int cupsInTheSink = 4;
-
-
- void Start ()
- {
- while(cupsInTheSink > 0)
- {
- Debug.Log ("I've washed a cup!");
- cupsInTheSink--;
- }
- }
- }
复制代码 DoWhileLoop- using UnityEngine;
- using System.Collections;
- public class DoWhileLoop : MonoBehaviour
- {
- void Start()
- {
- bool shouldContinue = false;
-
- do
- {
- print ("Hello World");
-
- }while(shouldContinue == true);
- }
- }
复制代码 ForeachLoop- using UnityEngine;
- using System.Collections;
- public class ForeachLoop : MonoBehaviour
- {
- void Start ()
- {
- string[] strings = new string[3];
-
- strings[0] = "First string";
- strings[1] = "Second string";
- strings[2] = "Third string";
-
- foreach(string item in strings)
- {
- print (item);
- }
- }
- }
复制代码 6.作用域和访问修饰符
了解变量和函数的作用域和可访问性。
ScopeAndAccessModifiers- using UnityEngine;
- using System.Collections;
- public class ScopeAndAccessModifiers : MonoBehaviour
- {
- public int alpha = 5;
-
-
- private int beta = 0;
- private int gamma = 5;
-
-
- private AnotherClass myOtherClass;
-
-
- void Start ()
- {
- alpha = 29;
-
- myOtherClass = new AnotherClass();
- myOtherClass.FruitMachine(alpha, myOtherClass.apples);
- }
-
-
- void Example (int pens, int crayons)
- {
- int answer;
- answer = pens * crayons * alpha;
- Debug.Log(answer);
- }
-
-
- void Update ()
- {
- Debug.Log("Alpha is set to: " + alpha);
- }
- }
复制代码 AnotherClass- using UnityEngine;
- using System.Collections;
- public class AnotherClass
- {
- public int apples;
- public int bananas;
-
-
- private int stapler;
- private int sellotape;
-
-
- public void FruitMachine (int a, int b)
- {
- int answer;
- answer = a + b;
- Debug.Log("Fruit total: " + answer);
- }
-
-
- private void OfficeSort (int a, int b)
- {
- int answer;
- answer = a + b;
- Debug.Log("Office Supplies total: " + answer);
- }
- }
复制代码 7.Awake 和 Start
如何使用 Unity 的两个初始化函数 Awake 和 Start。- using UnityEngine;
- using System.Collections;
- public class AwakeAndStart : MonoBehaviour
- {
- void Awake ()
- {
- Debug.Log("Awake called.");
- }
-
-
- void Start ()
- {
- Debug.Log("Start called.");
- }
- }
复制代码 8.Update 和 FixedUpdate
如何使用 Update 和 FixedUpdate 函数实现每帧的更改,以及它们之间的区别。- using UnityEngine;
- using System.Collections;
- public class UpdateAndFixedUpdate : MonoBehaviour
- {
- void FixedUpdate ()
- {
- Debug.Log("FixedUpdate time :" + Time.deltaTime);
- }
-
-
- void Update ()
- {
- Debug.Log("Update time :" + Time.deltaTime);
- }
- }
复制代码 9.矢量数学
矢量数学入门以及有关点积和叉积的信息。10.启用和禁用组件
如何在运行时通过脚本启用和禁用组件。- using UnityEngine;
- using System.Collections;
- public class EnableComponents : MonoBehaviour
- {
- private Light myLight;
-
-
- void Start ()
- {
- myLight = GetComponent<Light>();
- }
-
-
- void Update ()
- {
- if(Input.GetKeyUp(KeyCode.Space))
- {
- myLight.enabled = !myLight.enabled;
- }
- }
- }
复制代码 11.激活游戏对象
如何使用 SetActive 和 activeSelf/activeInHierarchy 单独处理以及在层级视图中处理场景内部游戏对象的活动状态。
ActiveObjects- using UnityEngine;
- using System.Collections;
- public class ActiveObjects : MonoBehaviour
- {
- void Start ()
- {
- gameObject.SetActive(false);
- }
- }
复制代码 CheckState- using UnityEngine;
- using System.Collections;
- public class CheckState : MonoBehaviour
- {
- public GameObject myObject;
-
-
- void Start ()
- {
- Debug.Log("Active Self: " + myObject.activeSelf);
- Debug.Log("Active in Hierarchy" + myObject.activeInHierarchy);
- }
- }
复制代码 12.Translate 和 Rotate
如何使用两个变换函数 Translate 和 Rotate 来更改非刚体对象的位置和旋转。- using UnityEngine;
- using System.Collections;
- public class TransformFunctions : MonoBehaviour
- {
- public float moveSpeed = 10f;
- public float turnSpeed = 50f;
-
-
- void Update ()
- {
- if(Input.GetKey(KeyCode.UpArrow))
- transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
-
- if(Input.GetKey(KeyCode.DownArrow))
- transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
-
- if(Input.GetKey(KeyCode.LeftArrow))
- transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);
-
- if(Input.GetKey(KeyCode.RightArrow))
- transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
- }
- }
复制代码 13.Look At
如何使用 LookAt 函数使一个游戏对象的变换组件面向另一个游戏对象的变换组件。- using UnityEngine;
- using System.Collections;
- public class CameraLookAt : MonoBehaviour
- {
- public Transform target;
-
- void Update ()
- {
- transform.LookAt(target);
- }
- }
复制代码 14.线性插值
在制作游戏时,有时可以在两个值之间进行线性插值。这是通过 Lerp 函数来完成的。- // 在此示例中,result = 4
- float result = Mathf.Lerp (3f, 5f, 0.5f);
- Vector3 from = new Vector3 (1f, 2f, 3f);
- Vector3 to = new Vector3 (5f, 6f, 7f);
- // 此处 result = (4, 5, 6)
- Vector3 result = Vector3.Lerp (from, to, 0.75f);
- void Update ()
- {
- light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
- }
复制代码 15.Destroy
如何在运行时使用 Destroy() 函数删除游戏对象和组件。
DestroyBasic- using UnityEngine;
- using System.Collections;
- public class DestroyBasic : MonoBehaviour
- {
- void Update ()
- {
- if(Input.GetKey(KeyCode.Space))
- {
- Destroy(gameObject);
- }
- }
- }
复制代码 DestroyOther- using UnityEngine;
- using System.Collections;
- public class DestroyOther : MonoBehaviour
- {
- public GameObject other;
-
-
- void Update ()
- {
- if(Input.GetKey(KeyCode.Space))
- {
- Destroy(other);
- }
- }
- }
复制代码 DestroyComponent- using UnityEngine;
- using System.Collections;
- public class DestroyComponent : MonoBehaviour
- {
- void Update ()
- {
- if(Input.GetKey(KeyCode.Space))
- {
- Destroy(GetComponent<MeshRenderer>());
- }
- }
- }
复制代码 16.GetButton 和 GetKey
本教程演示如何在 Unity 项目中获取用于输入的按钮或键,以及这些轴的行为或如何通过 Unity Input Manager 进行修改。
KeyInput- using UnityEngine;
- using System.Collections;
- public class KeyInput : MonoBehaviour
- {
- public GUITexture graphic;
- public Texture2D standard;
- public Texture2D downgfx;
- public Texture2D upgfx;
- public Texture2D heldgfx;
-
- void Start()
- {
- graphic.texture = standard;
- }
-
- void Update ()
- {
- bool down = Input.GetKeyDown(KeyCode.Space);
- bool held = Input.GetKey(KeyCode.Space);
- bool up = Input.GetKeyUp(KeyCode.Space);
-
- if(down)
- {
- graphic.texture = downgfx;
- }
- else if(held)
- {
- graphic.texture = heldgfx;
- }
- else if(up)
- {
- graphic.texture = upgfx;
- }
- else
- {
- graphic.texture = standard;
- }
-
- guiText.text = " " + down + "\n " + held + "\n " + up;
- }
- }
复制代码 ButtonInput- using UnityEngine;
- using System.Collections;
- public class ButtonInput : MonoBehaviour
- {
- public GUITexture graphic;
- public Texture2D standard;
- public Texture2D downgfx;
- public Texture2D upgfx;
- public Texture2D heldgfx;
-
- void Start()
- {
- graphic.texture = standard;
- }
-
- void Update ()
- {
- bool down = Input.GetButtonDown("Jump");
- bool held = Input.GetButton("Jump");
- bool up = Input.GetButtonUp("Jump");
-
- if(down)
- {
- graphic.texture = downgfx;
- }
- else if(held)
- {
- graphic.texture = heldgfx;
- }
- else if(up)
- {
- graphic.texture = upgfx;
- }
- else
- {
- graphic.texture = standard;
- }
-
- guiText.text = " " + down + "\n " + held + "\n " + up;
- }
- }
复制代码 17.GetAxis
如何在 Unity 中为游戏获取基于轴的输入,以及如何通过 Input Manager 修改这些轴。
AxisExample- using UnityEngine;
- using System.Collections;
- public class AxisExample : MonoBehaviour
- {
- public float range;
- public GUIText textOutput;
-
-
- void Update ()
- {
- float h = Input.GetAxis("Horizontal");
- float xPos = h * range;
-
- transform.position = new Vector3(xPos, 2f, 0);
- textOutput.text = "Value Returned: "+h.ToString("F2");
- }
- }
复制代码 AxisRawExample- using UnityEngine;
- using System.Collections;
- public class AxisRawExample : MonoBehaviour
- {
- public float range;
- public GUIText textOutput;
-
-
- void Update ()
- {
- float h = Input.GetAxisRaw("Horizontal");
- float xPos = h * range;
-
- transform.position = new Vector3(xPos, 2f, 0);
- textOutput.text = "Value Returned: "+h.ToString("F2");
- }
- }
复制代码 DualAxisExample- using UnityEngine;
- using System.Collections;
- public class DualAxisExample : MonoBehaviour
- {
- public float range;
- public GUIText textOutput;
-
-
- void Update ()
- {
- float h = Input.GetAxis("Horizontal");
- float v = Input.GetAxis("Vertical");
- float xPos = h * range;
- float yPos = v * range;
-
- transform.position = new Vector3(xPos, yPos, 0);
- textOutput.text = "Horizontal Value Returned: "+h.ToString("F2")+"\nVertical Value Returned: "+v.ToString("F2");
- }
- }
复制代码 18.OnMouseDown
如何检测碰撞体或 GUI 元素上的鼠标点击。- using UnityEngine;
- using System.Collections;
- public class MouseClick : MonoBehaviour
- {
- void OnMouseDown ()
- {
- rigidbody.AddForce(-transform.forward * 500f);
- rigidbody.useGravity = true;
- }
- }
复制代码 19.GetComponent
如何使用 GetComponent 函数来处理其他脚本或组件的属性。
UsingOtherComponents- using UnityEngine;
- using System.Collections;
- public class UsingOtherComponents : MonoBehaviour
- {
- public GameObject otherGameObject;
-
-
- private AnotherScript anotherScript;
- private YetAnotherScript yetAnotherScript;
- private BoxCollider boxCol;
-
-
- void Awake ()
- {
- anotherScript = GetComponent<AnotherScript>();
- yetAnotherScript = otherGameObject.GetComponent<YetAnotherScript>();
- boxCol = otherGameObject.GetComponent<BoxCollider>();
- }
-
-
- void Start ()
- {
- boxCol.size = new Vector3(3,3,3);
- Debug.Log("The player's score is " + anotherScript.playerScore);
- Debug.Log("The player has died " + yetAnotherScript.numberOfPlayerDeaths + " times");
- }
- }
复制代码 AnotherScript- using UnityEngine;
- using System.Collections;
- public class AnotherScript : MonoBehaviour
- {
- public int playerScore = 9001;
- }
复制代码 YetAnotherScript- using UnityEngine;
- using System.Collections;
- public class YetAnotherScript : MonoBehaviour
- {
- public int numberOfPlayerDeaths = 3;
- }
复制代码 20.DeltaTime
什么是 Delta Time?如何在游戏中将其用于对值进行平滑和解释?- using UnityEngine;
- using System.Collections;
- public class UsingDeltaTime : MonoBehaviour
- {
- public float speed = 8f;
- public float countdown = 3.0f;
-
- void Update ()
- {
- countdown -= Time.deltaTime;
- if(countdown <= 0.0f)
- light.enabled = true;
-
- if(Input.GetKey(KeyCode.RightArrow))
- transform.position += new Vector3(speed * Time.deltaTime, 0.0f, 0.0f);
- }
- }
复制代码 21.数据类型
了解“值”和“引用”数据类型之间的重要区别,以便更好地了解变量的工作方式。- using UnityEngine;
- using System.Collections;
- public class DatatypeScript : MonoBehaviour
- {
- void Start ()
- {
- //值类型变量
- Vector3 pos = transform.position;
- pos = new Vector3(0, 2, 0);
-
- //引用类型变量
- Transform tran = transform;
- tran.position = new Vector3(0, 2, 0);
- }
- }
复制代码 22.类
如何使用类来存储和组织信息,以及如何创建构造函数以便处理类的各个部分。
SingleCharacterScript- using UnityEngine;
- using System.Collections;
- public class SingleCharacterScript : MonoBehaviour
- {
- public class Stuff
- {
- public int bullets;
- public int grenades;
- public int rockets;
-
- public Stuff(int bul, int gre, int roc)
- {
- bullets = bul;
- grenades = gre;
- rockets = roc;
- }
- }
-
-
- public Stuff myStuff = new Stuff(10, 7, 25);
- public float speed;
- public float turnSpeed;
- public Rigidbody bulletPrefab;
- public Transform firePosition;
- public float bulletSpeed;
-
-
- void Update ()
- {
- Movement();
- Shoot();
- }
-
-
- void Movement ()
- {
- float forwardMovement = Input.GetAxis("Vertical") * speed * Time.deltaTime;
- float turnMovement = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;
-
- transform.Translate(Vector3.forward * forwardMovement);
- transform.Rotate(Vector3.up * turnMovement);
- }
-
-
- void Shoot ()
- {
- if(Input.GetButtonDown("Fire1") && myStuff.bullets > 0)
- {
- Rigidbody bulletInstance = Instantiate(bulletPrefab, firePosition.position, firePosition.rotation) as Rigidbody;
- bulletInstance.AddForce(firePosition.forward * bulletSpeed);
- myStuff.bullets--;
- }
- }
- }
复制代码 Inventory- using UnityEngine;
- using System.Collections;
- public class Inventory : MonoBehaviour
- {
- public class Stuff
- {
- public int bullets;
- public int grenades;
- public int rockets;
- public float fuel;
-
- public Stuff(int bul, int gre, int roc)
- {
- bullets = bul;
- grenades = gre;
- rockets = roc;
- }
-
- public Stuff(int bul, float fu)
- {
- bullets = bul;
- fuel = fu;
- }
-
- // 构造函数
- public Stuff ()
- {
- bullets = 1;
- grenades = 1;
- rockets = 1;
- }
- }
-
- // 创建 Stuff 类的实例(对象)
- public Stuff myStuff = new Stuff(50, 5, 5);
-
- public Stuff myOtherStuff = new Stuff(50, 1.5f);
-
- void Start()
- {
- Debug.Log(myStuff.bullets);
- }
- }
复制代码 MovementControls- using UnityEngine;
- using System.Collections;
- public class MovementControls : MonoBehaviour
- {
- public float speed;
- public float turnSpeed;
-
-
- void Update ()
- {
- Movement();
- }
-
-
- void Movement ()
- {
- float forwardMovement = Input.GetAxis("Vertical") * speed * Time.deltaTime;
- float turnMovement = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;
-
- transform.Translate(Vector3.forward * forwardMovement);
- transform.Rotate(Vector3.up * turnMovement);
- }
- }
复制代码 Shooting- using UnityEngine;
- using System.Collections;
- public class Shooting : MonoBehaviour
- {
- public Rigidbody bulletPrefab;
- public Transform firePosition;
- public float bulletSpeed;
-
-
- private Inventory inventory;
-
-
- void Awake ()
- {
- inventory = GetComponent<Inventory>();
- }
-
-
- void Update ()
- {
- Shoot();
- }
-
-
- void Shoot ()
- {
- if(Input.GetButtonDown("Fire1") && inventory.myStuff.bullets > 0)
- {
- Rigidbody bulletInstance = Instantiate(bulletPrefab, firePosition.position, firePosition.rotation) as Rigidbody;
- bulletInstance.AddForce(firePosition.forward * bulletSpeed);
- inventory.myStuff.bullets--;
- }
- }
- }
复制代码 23.Instantiate
如何在运行期间使用 Instantiate 创建预制件的克隆体。
UsingInstantiate- using UnityEngine;
- using System.Collections;
- public class UsingInstantiate : MonoBehaviour
- {
- public Rigidbody rocketPrefab;
- public Transform barrelEnd;
-
-
- void Update ()
- {
- if(Input.GetButtonDown("Fire1"))
- {
- Rigidbody rocketInstance;
- rocketInstance = Instantiate(rocketPrefab, barrelEnd.position, barrelEnd.rotation) as Rigidbody;
- rocketInstance.AddForce(barrelEnd.forward * 5000);
- }
- }
- }
复制代码 RocketDestruction- using UnityEngine;
- using System.Collections;
- public class RocketDestruction : MonoBehaviour
- {
- void Start()
- {
- Destroy (gameObject, 1.5f);
- }
- }
复制代码 24.数组
使用数组将变量集合在一起以便于管理。- using UnityEngine;
- using System.Collections;
- public class Arrays : MonoBehaviour
- {
- public GameObject[] players;
- void Start ()
- {
- players = GameObject.FindGameObjectsWithTag("Player");
-
- for(int i = 0; i < players.Length; i++)
- {
- Debug.Log("Player Number "+i+" is named "+players[i].name);
- }
- }
- }
复制代码 25.Invoke
Invoke 函数可用于安排在以后的时间进行方法调用。在本视频中,您将学习如何在 Unity 脚本中使用 Invoke、InvokeRepeating 和 CancelInvoke 函数。
InvokeScript- using UnityEngine;
- using System.Collections;
- public class InvokeScript : MonoBehaviour
- {
- public GameObject target;
-
-
- void Start()
- {
- Invoke ("SpawnObject", 2);
- }
-
- void SpawnObject()
- {
- Instantiate(target, new Vector3(0, 2, 0), Quaternion.identity);
- }
- }
复制代码 InvokeRepeating- using UnityEngine;
- using System.Collections;
- public class InvokeRepeating : MonoBehaviour
- {
- public GameObject target;
-
-
- void Start()
- {
- InvokeRepeating("SpawnObject", 2, 1);
- }
-
- void SpawnObject()
- {
- float x = Random.Range(-2.0f, 2.0f);
- float z = Random.Range(-2.0f, 2.0f);
- Instantiate(target, new Vector3(x, 2, z), Quaternion.identity);
- }
- }
复制代码 26.枚举
枚举可用于创建相关常量的集合。在本视频中,您将学习如何在代码中声明和使用枚举。- public class EnumScript : MonoBehaviour
- {
- enum Direction {North, East, South, West};
- void Start ()
- {
- Direction myDirection;
-
- myDirection = Direction.North;
- }
-
- Direction ReverseDirection (Direction dir)
- {
- if(dir == Direction.North)
- dir = Direction.South;
- else if(dir == Direction.South)
- dir = Direction.North;
- else if(dir == Direction.East)
- dir = Direction.West;
- else if(dir == Direction.West)
- dir = Direction.East;
-
- return dir;
- }
- }
复制代码 27.Switch 语句
Switch 语句的作用类似于简化条件。当您希望将单个变量与一系列常量进行比较时,这类语句很有用。在本视频中,您将学习如何编写和使用 switch 语句。- using UnityEngine;
- using System.Collections;
- public class ConversationScript : MonoBehaviour
- {
- public int intelligence = 5;
-
-
- void Greet()
- {
- switch (intelligence)
- {
- case 5:
- print ("Why hello there good sir! Let me teach you about Trigonometry!");
- break;
- case 4:
- print ("Hello and good day!");
- break;
- case 3:
- print ("Whadya want?");
- break;
- case 2:
- print ("Grog SMASH!");
- break;
- case 1:
- print ("Ulg, glib, Pblblblblb");
- break;
- default:
- print ("Incorrect intelligence level.");
- break;
- }
- }
- }
复制代码 |
|