franciscochonge 发表于 2022-5-6 10:27

Unity3d初级编程--Unity官方教程

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;
      
      strings = "First string";
      strings = "Second string";
      strings = "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.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;
      }
    }
}
页: [1]
查看完整版本: Unity3d初级编程--Unity官方教程