赞
踩
官方链接: https://learn.unity.com/project/chu-ji-bian-cheng?uv=4.x
话不多说,直接贴代码。
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; } } }
什么是变量和函数?它们如何为我们存储和处理信息?
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; } }
了解编写代码的一些基本约定和语法:点运算符、分号、缩进和注释。
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!");
}
}
}
如何使用 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."); } } }
如何使用 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); } } }
了解变量和函数的作用域和可访问性。
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); } }
如何使用 Unity 的两个初始化函数 Awake 和 Start。
using UnityEngine; using System.Collections; public class AwakeAndStart : MonoBehaviour { void Awake () { Debug.Log("Awake called."); } void Start () { Debug.Log("Start called."); } }
如何使用 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); } }
矢量数学入门以及有关点积和叉积的信息。
// 无代码
如何在运行时通过脚本启用和禁用组件。
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; } } }
如何使用 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);
}
}
如何使用两个变换函数 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); } }
如何使用 LookAt 函数使一个游戏对象的变换组件面向另一个游戏对象的变换组件。
using UnityEngine;
using System.Collections;
public class CameraLookAt : MonoBehaviour
{
public Transform target;
void Update ()
{
transform.LookAt(target);
}
}
在制作游戏时,有时可以在两个值之间进行线性插值。这是通过 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); }
如何在运行时使用 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>());
}
}
}
本教程演示如何在 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; } }
如何在 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"); } }
如何检测碰撞体或 GUI 元素上的鼠标点击。
using UnityEngine;
using System.Collections;
public class MouseClick : MonoBehaviour
{
void OnMouseDown ()
{
rigidbody.AddForce(-transform.forward * 500f);
rigidbody.useGravity = true;
}
}
如何使用 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;
}
什么是 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); } }
了解“值”和“引用”数据类型之间的重要区别,以便更好地了解变量的工作方式。
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); } }
如何使用类来存储和组织信息,以及如何创建构造函数以便处理类的各个部分。
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--; } } }
如何在运行期间使用 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);
}
}
使用数组将变量集合在一起以便于管理。
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); } } }
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); } }
枚举可用于创建相关常量的集合。在本视频中,您将学习如何在代码中声明和使用枚举。
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; } }
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; } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。