**

一、 版本控制

**

  1. 目前流行的两大方式:SVN和Git; 前者采用增量式,后者采用快照式; 前者产生单点故障影响大。
  2. 安装git软件。
  3. 本地库——历史版本; 暂存区——临时存储; 工作区——写代码。
  4. 代码托管中心——维护远程库。
    (1) 团队内;
    (2) 跨团队。
  5. 本队库初始化

**

二、以Slider方式移动

**

  1. Slider Joint 2D:让一个物体沿着另一个物体转;将此赋给空物体并勾选Kinematic选项让其固定之后将需要移动的物体载入其中,并打开Motor,设置其参数大于0,即可让物体沿着空物体进行Slider形式移动。将下方脚本挂载于空物体中并设置其最大距离即可产生来回运动效果。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    // Mount this script to the empty object that has the property of Slider joint 2d
    // Do remember positioning the second/tail anchor point of slider joint 2D vertical to each other!!!
    public class TranslationLoop : MonoBehaviour
    {//北工大软院------艾孜尔江编写,使用请标明出处
    public SliderJoint2D sj2d; // Use properties in joint
    public int upperTrans;

     // Start is called before the first frame updatevoid Start(){//北工大软院------艾孜尔江编写,使用请标明出处sj2d = GetComponent<SliderJoint2D>();  //get the propertiessj2d.useLimits = true;  //Use the limits of the slider joint 2D, make sure that the translation limit is open }void FixedUpdate(){//北工大软院------艾孜尔江编写,使用请标明出处float maxStep = Mathf.Abs(Mathf.Sin(Time.time) * upperTrans);  // Use sinus mathematical calculation// to get duration(-1,1); then calculate its AbsJointTranslationLimits2D jt2D = new JointTranslationLimits2D();  jt2D.max = maxStep;sj2d.limits = jt2D;}
    

    }

**

三、UI提示框

**

  1. 使用Canvas建立Button后对于Button按键添加Onclick事项必须将脚本先赋给一个空物体再将其拖入OnClick列表中,勾选相应的函数即可实现。

(1)实现退出脚本如下:

using UnityEngine;//北工大软院------艾孜尔江编写,使用请标明出处
using System.Collections;public class BTNExit : MonoBehaviour {public void BtnQuit(){
#if UNITY_EDITOR//北工大软院------艾孜尔江编写,使用请标明出处UnityEditor.EditorApplication.isPlaying = false;
#elseApplication.Quit();
#endif}
}

(2)实现游戏暂停:

    `Time.timeScale = 0;`    【当设置其为1时则为“继续”】

(3)判断点击值并据此弹框:

   if (Input.GetKeyDown(KeyCode.Escape))//北工大软院------艾孜尔江编写,使用请标明出处{  uiImage.SetActive(!uiImage.activeSelf);  // The 'active' function returns the result of status of objectif (uiImage.activeSelf) {      Time.timeScale = 0;            }else           {            Time.timeScale = 1;          }        }

**

四、实现物体循环移动和旋转

**

  1. 方法一思路:通过对时间的计算,每隔一段时间让物体旋转,实现来回移动。

float TranslateSpeed = 0.02f;float TranslateSpeedTime = 0.1f;void Update () {//北工大软院------艾孜尔江编写,使用请标明出处TranslateSpeedTime += 0.1f;transform.Translate(Vector3.forward * TranslateSpeed);if (TranslateSpeedTime > 150.0f){transform.Rotate(0, 180, 0);TranslateSpeedTime = 0.1f;}    }//北工大软院------艾孜尔江编写,使用请标明出处

(1)首先给物体定义一个初始速度和初始的时间。
(2)然后使时间递增。
(3)通过Translate函数使物体移动。
(4)Vector3.forward 是向前移动的意思,==Vector3(0,0,1)* Vector3.up 向上 具体可查看API
(5)if判断,规定一个时间,如若TranslateSpeedTime达到这个时间,让物体沿着Y轴旋转并且重置时间,继续调用Update即可实现物体的重复移动并旋转。

  1. 方法二:
       public class BlutMov : MonoBehaviour{int timeMov = 0;public int timeLasted;private Vector2 objectPos;// Use this for initializationvoid Start()//北工大软院------艾孜尔江编写,使用请标明出处{        objectPos = this.transform.position;  // The original position of the object}void Update(){timeMov += 1;transform.Translate(Vector2.right * Time.deltaTime);if (timeMov == timeLasted*100){            this.transform.position = objectPos;            timeMov = 0;        }    }    }
  1. 方法三【使用如下插件】:
    using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// Move back and forth/// </summary>public class Exercise : MonoBehaviour{//北工大软院------艾孜尔江编写,使用请标明出处public float xLength = 1;  // The length of X array direction       (Must be greater than 0!)public float yLength = 1;  // The length of Y array direction       (Must be greater than 0!)public float zLength = 1;  // The length of Z array direction       (Must be greater than 0!)public float xSpeed;   //  The speed of changing  speed in X directionpublic float ySpeed;  //  The speed of changing speed in Y directionpublic float zSpeed;  //   The speed of changing speed in Z directionpublic bool jointly;  // Choose the moving way of the objectprivate float position;// Update is called once per framevoid Update(){if (jointly)//北工大软院------艾孜尔江编写,使用请标明出处{//北工大软院------艾孜尔江编写,使用请标明出处transform.position = new Vector3(Mathf.PingPong( Time.time  * xSpeed , xLength) , Mathf.PingPong(Time.time  * ySpeed , yLength)  ,Mathf.PingPong(Time.time  * ySpeed , zLength));// The function of PingPong in Mathf class can calculate out a floating result, the first number can be 0 but must be a variable number while the second number must be static number greater than 0. }//北工大软院------艾孜尔江编写,使用请标明出处else{transform.position = new Vector3(Mathf.Repeat( Time.time  * xSpeed , xLength) , Mathf.Repeat(Time.time  * ySpeed , yLength)  ,Mathf.Repeat(Time.time  * ySpeed , zLength));}}}

**

五、键盘控制物体移动

**

  1. 三维场景下直接使用下方脚本;二维场景下将Vector3中的Z轴参数设置为0,将Y轴参数设置为v即可。
    脚本如下:
using UnityEngine;
using System.Collections;public class KingMov : MonoBehaviour
{//北工大软院------艾孜尔江编写,使用请标明出处[Header(“speed name can be described here”)]public float speed = 5;private Transform transform;public AudioClip testAu;private AudioSource audio;// Use this for initializationvoid Start(){transform = this.GetComponent<Transform>();audio = this.GetComponent<AudioSource>();//北工大软院------艾孜尔江编写,使用请标明出处}// Update is called once per framevoid Update(){//北工大软院------艾孜尔江编写,使用请标明出处float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");//transform.Translate(new Vector3(0.1f, 0, 0) * speed * 0.02f);transform.Translate(new Vector3(h, v, 0) * speed * Time.deltaTime);if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){//北工大软院------艾孜尔江编写,使用请标明出处if (!audio.isPlaying)  // These "if...else..."scripts can be abandoned while the condition is "GetKeyDown"{audio.clip = testAu;audio.Play();}}else if(Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.UpArrow)){            audio.Stop();        }    }}

**

六、游戏暂停用法

**

  1. 使用“Time.timeScale() = 0;”可以暂停整个游戏,但是注意,这样的暂停方式对于与time模块无关的事务并不会起到任何效果,同时,尤其对于那些在Update函数里面的一些并没有用到time模块的代码仍然会继续执行,由此可见,暂停只不过是暂停与时间相关的代码块。

**

七、计时器在游戏中及结束时的显示

**
如将计时器用在“仅提示在玩家最后退出游戏时”这一功能上时,应当注意在UI中选择Canvas里面的Canvas组件并将其通过enabled(false)方式关闭,不要直接使用SetActive(falses)函数关闭所Cavas有组件,这样才能让计时器暗自运行下去。
脚本一:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Timer : MonoBehaviour
{//北工大软院------艾孜尔江编写,使用请标明出处float time, startTime;Text timer;void Start(){timer = GameObject.Find("Canvas/Timer").GetComponent<Text>();startTime = Time.time;  // Get the started time}
//北工大软院------艾孜尔江编写,使用请标明出处void Update(){time = Time.time - startTime;int seconds = (int)(time % 60);int minutes = (int)(time / 60);string strTime = string.Format("{0:00}:{1:00}", minutes, seconds);  // Show in formattimer.text = strTime;}
}

**

八、使用脚本控制动画和音效

//艾孜尔江撰写
using UnityEngine;
using System.Collections;public class KingMov : MonoBehaviour
{
//北工大软院------艾孜尔江编写,使用请标明出处public float speed = 5;private Transform transform;public AudioClip testAu;private AudioSource audio;
//北工大软院------艾孜尔江编写,使用请标明出处// Use this for initializationvoid Start(){transform = this.GetComponent<Transform>();audio = this.GetComponent<AudioSource>();}// Update is called once per framevoid Update(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");//transform.Translate(new Vector3(0.1f, 0, 0) * speed * 0.02f);transform.Translate(new Vector3(h, v, 0) * speed * Time.deltaTime);if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){if (!audio.isPlaying){audio.clip = testAu;audio.Play();}}else if(Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.UpArrow)){            audio.Stop();   }    }  }

**

九、游戏退出

**

using UnityEngine;
using System.Collections;public class BTNExit : MonoBehaviour {public void BtnQuit(){
#if UNITY_EDITORUnityEditor.EditorApplication.isPlaying = false;
#elseApplication.Quit();
#endif}
}

**

十、动画物件根据按钮的点击进行呈现

**

   void Update(){if (Input.GetKeyDown(KeyCode.A)){//北工大软院------艾孜尔江编写,使用请标明出处GetComponent<Animator>().enabled = !GetComponent<Animator>().enabled;GetComponent<SpriteRenderer>().enabled= !GetComponent<SpriteRenderer>().enabled;}}

**

十一、使用暂停功能后的退回游戏

**

 public void ChangeScene(string sceneName){SceneManager.LoadScene(sceneName);Time.timeScale = 1;  //暂停模式关闭
}
十二、通过Alpha值制作开机闪屏Logo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//北工大软院------艾孜尔江编写,使用请标明出处
public class AlphaController : MonoBehaviour
{// Update is called once per framevoid Update(){//北工大软院------艾孜尔江编写,使用请标明出处if (GetComponent<SpriteRenderer>().color.a > 0) //Get the alpha component under the sprite render's color module{GetComponent<SpriteRenderer>().color -= new Color(0, 0, 0, 0.02f);   //Time.deltaTime);}}
}

**

十三、物体根据条件传送

原理:

public gameobject position;{void on tirggerenter ()...}
//北工大软院------艾孜尔江编写,使用请标明出处other.transforn.position = destination.position;

**

十四、射线检测案例参考【二维】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RayCastDector : MonoBehaviour
//北工大软院------艾孜尔江编写,使用请标明出处
{public Transform detect_start;//检测起点public float player_max_distance;//检测玩家的最大长度public float max_degree;//检测的最大角度[HideInInspector] public bool detected_block = false;//是否检测到障碍物[HideInInspector] public bool detected_player = false;//是否检测到玩家private RaycastHit2D hit_info;//射线击中信息private bool player_hit = false;//玩家是否撞上来public GameObject Door;/*每帧更新的部分*/private void Update(){if (!player_hit)//如果玩家没有主动撞上来{detected_player = detected_block = false;//假定什么都没有检测到}//北工大软院------艾孜尔江编写,使用请标明出处for (detect_start.localEulerAngles = new Vector3(0, 0, 360 - max_degree); detect_start.localEulerAngles.z >= (360 - max_degree) || detect_start.localEulerAngles.z <= max_degree; detect_start.localEulerAngles += new Vector3(0, 0, 1))//在敌人左右70度范围内{if (hit_info = Physics2D.Raycast(detect_start.position, detect_start.up, player_max_distance))// Raycast(orign: , direction: , distance: )){//The action that the other detected component  will get.  Below is an example of making it black.Door.GetComponent<SpriteRenderer>().color = Color.black;}else{//北工大软院------艾孜尔江编写,使用请标明出处Door.GetComponent<SpriteRenderer>().color = Color.white;}//Debug.DrawRay(detect_start.position, detect_start.up,Color.white, player_max_distance);}}
}

**

十五、用脚本控制Slider组件

在未使用脚本运行时,slider组件默认接收左右按键来调整其填充量,倘要根据不同的情况让填充量发生不同的变化,则需要通过脚本来控制。下方只要将条件改变,即可改变填充条件。

void Update(){if (Input.GetKeyDown(KeyCode.O)){//北工大软院------艾孜尔江编写,使用请标明出处GetComponent<Slider>().value -= point;}else if (Input.GetKeyDown(KeyCode.P)){GetComponent<Slider>().value -= 25;}//北工大软院------艾孜尔江编写,使用请标明出处else if (Input.GetKey(KeyCode.UpArrow)){GetComponent<Slider>().value += 5;}else if (Input.GetKey(KeyCode.DownArrow)){GetComponent<Slider>().value -= 5;}}

**

十六、播放音乐

**

  1. 可以通过两种方式在脚本中播放音乐。第一种方法是:首先在自己创建的类中声明一个公共AudioClip的一个音乐对象,之后再声明一个公共的AudioSource的一个音源对象,后续根据相应条件播放音乐的时候在条件下方先指定音源的clip对象,再通过Play()函数打开音源即可。
 public AudioClip bgMusic;private AudioSource audio;
//北工大软院------艾孜尔江编写,使用请标明出处------{audio.clip = bgMusic;audio.Play();    }
  1. 第二种方法是在上面方法的后半部分做调整,直接在声明完相应的对象之后要播放时使用音源对象的PlayOneShot(音乐对象)函数来播放音乐。
 public AudioClip bgMusic;private AudioSource audio;
//北工大软院------艾孜尔江编写,使用请标明出处------{audio.PlayOneShot(bgMusic);  }
  1. audio.PlayDelayed(5.0f);则是在指定时间播放音乐,右边表示在游戏进行后的5秒中播放音乐。
  2. 必须要使用某个组件在脚本内部注明后将会更加方便,也会有效避免误删组件。用
    [RequireComponent(typeof(组件名称))]即可。

【注意:通过private AudioSource audio声明音源之后一定记得在Start()函数中进行初始化。初始化写法一般为——audio = GetComponent();。】

**

十七、初识协程

**

  1. 案例:
   public void Select(GameStone c)//北工大软院------艾孜尔江编写,使用请标明出处{//  Destroy(c.gameObject);if (currentStone == null){currentStone = c;//北工大软院------艾孜尔江编写,使用请标明出处currentStone.isSelected = true;return;}else{//The balls can only be exchanged while they are close to each other. The mathematical calculation below shows that the indexes be compared under the principle of the matrix, which is very important!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//北工大软院------艾孜尔江编写,使用请标明出处if (Mathf.Abs(currentStone.rowIndex - c.rowIndex) + Mathf.Abs(currentStone.columIndex - c.columIndex) == 1){// ExchangeAdMatches(currentStone, c);StartCoroutine(ExchangeAdMatches(currentStone, c));  //调用协程函数的方式}currentStone.isSelected = false;currentStone = null;}}    IEnumerator ExchangeAdMatches(GameStone q, GameStone p)     //要带有协程函数标识
// IEnumerator is used for making some of the functions wait or do something{Exchange(q, p);yield return new WaitForSeconds(0.5f); //等待0.5秒之后再往下走if (CheckHorizontalMathes() || CheckVerticalMatches()){RemoveSame();//北工大软院------艾孜尔江编写,使用请标明出处}else{Exchange(q, p);}//北工大软院------艾孜尔江编写,使用请标明出处
}

【注意】
2. 协程类似于线程,可以视为是一种伪线程。当程序中的代码在C#脚本中运行到StartCoroutine();函数时,就会以异步的方式直接继续执行下面的代码,分立出来的StartCorutine()中的函数也会被执行,这就相当于fork出了另一个线程。该协程执行StartCorutine中得到函数时会找到以协程的方式命名的函数并在里面执行,执行完必须会找到yield return代码段,并根据其返回的时间进行暂停或选择直接继续。但是这也是会执行一遍而已,故将协程的函数放到Update()函数中时,若不加以设置,其实就是没有了实际的协程功效。处理方式如下:【通过下方代码可以实现计时器效果】

public class AudioController : MonoBehaviour
{
//北工大软院------艾孜尔江编写,使用请标明出处private bool IsFork = false;// Update is called once per framevoid Update(){if (!IsFork){StartCoroutine(VolumeController());//北工大软院------艾孜尔江编写,使用请标明出处}}IEnumerator VolumeController(){//北工大软院------艾孜尔江编写,使用请标明出处IsFork = true;yield return new WaitForSeconds(2);Debug.Log(Time.time);   // 需要在相应时间(2秒)后执行的代码IsFork = false;}
}
//北工大软院------艾孜尔江编写,使用请标明出处
  1. 进一步了解Unity中协程(IEnumerator)的使用方法:【摘】

在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。
在通常情况下,如果我们想要让一个物体逐渐消失,我们希望方法可以一次调用便可在程序后续执行中实现我们想要的效果。
我们希望代码可以写成如下所示:

void Fade()
{for (float f = 1f; f >= 0; f -= 0.1f) {//北工大软院------艾孜尔江编写,使用请标明出处Color c = renderer.material.color;c.a = f;renderer.material.color = c;//北工大软院------艾孜尔江编写,使用请标明出处}
}

然而该方法在调用时将在一帧中执行完毕,无法实现预期的效果。如果将该方法改写并放到Update函数中可实现我们预期的效果,但是还不够优雅。

float time = 0f;
float fadeTime = 2f;
void Fade()
{
//北工大软院------艾孜尔江编写,使用请标明出处time += Time.dealttime;Color c = renderer.material.color;c.a = 1f - time/fadeTime;//北工大软院------艾孜尔江编写,使用请标明出处renderer.material.color = c;
}
//北工大软院------艾孜尔江编写,使用请标明出处

Unity中的协程方法通过yield这个特殊的属性可以在任何位置、任意时刻暂停。也可以在指定的时间或事件后继续执行,而不影响上一次执行的就结果,提供了极大地便利性和实用性。
协程在每次执行时都会新建一个(伪)新线程来执行,而不会影响主线程的执行情况。
正如上边的方法,我们使用协程可以更加方便的实现我们想要的效果。

void Fade()
{for (float f = 1f; f >= 0; f -= 0.1f) {//北工大软院------艾孜尔江编写,使用请标明出处Color c = renderer.material.color;c.a = f;renderer.material.color = c;//北工大软院------艾孜尔江编写,使用请标明出处yield return null;//下一帧继续执行for循环yield return new WaitForSeconds(0.1f);//0.1秒后继续执行for循环}//北工大软院------艾孜尔江编写,使用请标明出处
}

我们通过StartCoroutine()函数来调用协程函数。

值得注意的是,协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中。当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一帧内等这个操作完成后再执行其他操作。
如我们需要执行一个循环:

IEnumerator CaculateResult()
{
//北工大软院------艾孜尔江编写,使用请标明出处for (int i = 0; i < 10000; i++){//内部循环计算//在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出//yield return null;}//北工大软院------艾孜尔江编写,使用请标明出处//如果取消内部的yield操作,仅在for循环外边写yield操作,则会执行完10000次循环后再结束,相当于直接调用了一个函数,而非协程。//yield return null;
}

调用协程的方法有两种,分别是StartCoroutine(/这里直接调用方法,添加参数/),另一种是StartCoroutine(/这里填写”字符串的方法名字”,方法参数/)。第一种方法的优势在于可以调用多个参数的方法,后一种方法只能调用不含参数或只包含一个参数的协程方法。但是第一种方法不能通过StopCoroutine(/这里填写”字符串的方法名”/)来结束协程,只能通过StopAllCoroutines来结束。后一种则可以通过StopCoroutine来结束对正在执行的协程的调用。

协程在实现过程中我们需要注意yield调用的时机,执行较为复杂的计算时,如果在时间上没有严格的先后顺序,我们可以每帧执行一次循环来完成计算,或者每帧执行指定次数的循环来防止在程序运行中出现的卡顿现象。

yield return的介绍:
yield return null; // 下一帧再执行后续代码
yield return 0; //下一帧再执行后续代码
yield return 6;//(任意数字) 下一帧再执行后续代码
yield break; //直接结束该协程的后续操作
yield return asyncOperation;//等异步操作结束后再执行后续代码
yield return StartCoroution(/
某个协程/);//等待某个协程执行完毕后再执行后续代码
yield return WWW();//等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候…如:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候… 如:yield return new WaitWhile(() => frame < 10);
当某一个脚本中的协程在执行过程中,如果我们将该脚本的enable设置为false,协程不会停止。只有将挂载该脚本的物体设置为SetActive(false)时才会停止。

Unity在调用StartCoroutine()后不会等待协程中的内容返回,会立即执行后续代码。

虽然协程十分方便和灵活,但不当的使用会使程序产生无法预想的后果,请使用前慎重考虑。

**

十八、选中得到物体改变颜色

**

  1. 先声明一个SpriteRender类下的对象,该对象具有颜色属性、Alpha属性等,涉及到改变颜色时使用到其颜色属性即可。
   public SpriteRenderer render;//北工大软院------艾孜尔江编写,使用请标明出处public bool isSelected{//北工大软院------艾孜尔江编写,使用请标明出处set{if (value){render.color = Color.red;}else{render.color = Color.white;}}
}
  1. 当只使用get参数设置相应项时(必须去除set参数设置项),定义的该布尔变量在外部无法在外部只能读取而无法被修改,可以获取其内部的值赋给其他变量而不能被重新使用。注意返回值的设置,后续使用时直接使用其返回值。

**

十九、鼠标事件获取

使用

//北工大软院------艾孜尔江编写,使用请标明出处public void OnMouseDown(){-----------------
}
//北工大软院------艾孜尔江编写,使用请标明出处

函数可以获取鼠标事件,在里面加入相应的触发事件。

当获取鼠标离开某个区域时需要用到 public OnMouseExit(){}函数。 在使用这些函数的时候必须要指定collider区域才能够在该区域发生相应动作。

案例(鼠标进入后放音乐):

using System.Collections;
//北工大软院------艾孜尔江编写,使用请标明出处
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(BoxCollider2D))]
public class DectectMouse : MonoBehaviour
//北工大软院------艾孜尔江编写,使用请标明出处
{public AudioClip dangerMusic;private AudioSource audio;void Start(){audio = GetComponent<AudioSource>();}void OnMouseEnter(){//北工大软院------艾孜尔江编写,使用请标明出处audio.PlayOneShot(dangerMusic);}void OnMouseExit(){audio.Stop();}
}
//北工大软院------艾孜尔江编写,使用请标明出处

**

二十、让物体跟踪鼠标轨迹/鼠标光标消失

**

  1. 将要跟踪鼠标的图片挂载在脚本上即可。该脚本需要挂载在相机上!
//北工大软院------艾孜尔江编写,使用请标明出处
public class MouseFollower : MonoBehaviour
{private Vector2 mousePos;//北工大软院------艾孜尔江编写,使用请标明出处public GameObject mousePhoto;private void Start(){Cursor.visible = false;    //让鼠标光标消失}void Update(){mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);mousePhoto.transform.position = new Vector3(mousePos.x, mousePos.y, mousePhoto.transform.position.z) ;  // Using new vector3 position to make sure the position of the mouse. Make the Z array's position change always attach to the object itself.}//北工大软院------艾孜尔江编写,使用请标明出处
}
//北工大软院------艾孜尔江编写,使用请标明出处

**

二十一、从外部获取某个物体的某个组件

**
案例用法:
Camera.main.GetComponent<MouseFollower>().enabled = false;

**

二十二、计时器

**

  1. 直接自己撰写一个计时器:
 private float timer;            // 计时器初始化if(timer < 0)// 计时结束//北工大软院------艾孜尔江编写,使用请标明出处{CmdFire();     // events that will happen some time later//  此处撰写需要在计时之后执行的代码timer = 1;}//北工大软院------艾孜尔江编写,使用请标明出处else// 计时开始{//北工大软院------艾孜尔江编写,使用请标明出处timer -= Time.deltaTime;// 每次自减一个时间单位(秒)}//北工大软院------艾孜尔江编写,使用请标明出处
  1. 【通过下方代码可以实现计时器效果,上方《协程初始》中以有提及】
//北工大软院------艾孜尔江编写,使用请标明出处
private bool IsFork = false;// Update is called once per framevoid Update(){//北工大软院------艾孜尔江编写,使用请标明出处if (!IsFork){StartCoroutine(VolumeController());}}
//北工大软院------艾孜尔江编写,使用请标明出处IEnumerator VolumeController(){IsFork = true;yield return new WaitForSeconds(2);Debug.Log(Time.time);   // 需要在相应时间(2秒)后执行的代码IsFork = false;}
}
//北工大软院------艾孜尔江编写,使用请标明出处

【推荐!!!!!!!!!!!!!!!!!!!!!!】
3. 直接使用内部函数,最为方便的方法。注意Invoke()函数分别在Start()函数中和Update()函数中的使用方法,略有不同,如果在Update()函数中不进行如下判断性质的设置,则计时也会失效。
(1) 在Start()函数中直使用:
void Start()
{
InvokeRepeating(“SetVolum”,0,2); //引号内部的为需要间隔一定时间执行的函数
//第二个参数为起始时间,第三个参数为时间间隔,以秒为单位
}
(2) 在Update()函数中执行时需要使用自带的isInvoking()函数判断其是否处在执行状态:

//北工大软院------艾孜尔江编写,使用请标明出处void Update(){if (!IsInvoking())//北工大软院------艾孜尔江编写,使用请标明出处{Invoke("SetVolum",2);//北工大软院------艾孜尔江编写,使用请标明出处}}//北工大软院------艾孜尔江编写,使用请标明出处

**

二十三、调试

**

  1. 使用Debug.Log(“调试提示语”);可以通过结果窗口中的提示语句进行调试。
  2. 使用Debug.Break();可以直接让程序在运行到此处时暂停。

二十四、Mathf类中的函数群

  1. Mathf.SmoothDamp : 平滑缓冲,东西不是僵硬的移动而是做减速缓冲运动到指定位置。
    (1) 案例脚本【通过缓慢改变位置实现缓慢跟踪效果】:
//北工大软院------艾孜尔江编写,使用请标明出处
public Transform target;        //The player(跟踪的目标)public float smoothTime= 0.3f;  //Smooth Time(缓冲时间,时间越大缓冲速度越慢,移动也越慢)private Vector2 velocity;       //Velocity 承载的变量,相对缓冲减速void  Update (){//北工大软院------艾孜尔江编写,使用请标明出处//Set the positiontransform.position = new    Vector3( Mathf.SmoothDamp(transform.position.x, target.position.x, ref velocity.x, smoothTime), Mathf.SmoothDamp( transform.position.y, target.position.y, ref velocity.y, smoothTime),   transform.position.z);   //三维游戏中可以相应加入Z轴的缓冲
}
//北工大软院------艾孜尔江编写,使用请标明出处
  1. Mathf.CeilToInt : 最小整数。返回最小的整数大于或等于f。

  2. Mathf.Ceil : 上限值。 返回 f 指定数字或表达式的上限值。数字的上限值是大于等于该数字的最接近的整数。

  3. Mathf 数学运算
    Mathf.Abs绝对值
    计算并返回指定参数 f 绝对值。
    Mathf.Acos反余弦
    static function Acos (f : float) : float
    以弧度为单位计算并返回参数 f 中指定的数字的反余弦值。
    Mathf.Approximately近似
    static function Approximately (a : float, b: float) : bool
    比较两个浮点数值,看它们是否非常接近, 由于浮点数值不精确,不建议使用等于来比较它们。例如,1.0==10.0/10.0也许不会返回true。

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour {publicvoid Awake() {//北工大软院------艾孜尔江编写,使用请标明出处if(Mathf.Approximately(1.0F, 10.0F / 10.0F))print("same");//北工大软院------艾孜尔江编写,使用请标明出处
//北工大软院------艾孜尔江编写,使用请标明出处}//北工大软院------艾孜尔江编写,使用请标明出处
}//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.Asin反正弦
static function Asin (f : float) : float
以弧度为单位计算并返回参数 f 中指定的数字的反正弦值。
Mathf.Atan2反正切
static function Atan2 (y : float, x :float) : float
以弧度为单位计算并返回 y/x 的反正切值。返回值表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。
返回值是在x轴和一个二维向量开始于0个结束在(x,y)处之间的角。

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour {publicTransform target;voidUpdate() {//北工大软院------艾孜尔江编写,使用请标明出处Vector3relative = transform.InverseTransformPoint(target.position);floatangle = Mathf.Atan2(relative.x, relative.z) * Mathf.Rad2Deg;transform.Rotate(0,angle, 0);}//北工大软院------艾孜尔江编写,使用请标明出处
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.Atan反正切
static function Atan (f : float) :float
计算并返回参数 f 中指定的数字的反正切值。返回值介于负二分之 pi 与正二分之 pi 之间。
Mathf.CeilToInt最小整数
static function CeilToInt (f : float) : int
返回最小的整数大于或等于f。
Mathf.Ceil上限值
static function Ceil (f : float) : float
返回 f 指定数字或表达式的上限值。数字的上限值是大于等于该数字的最接近的整数。
Mathf.Clamp01限制0~1
static function Clamp01 (value : float) :float
限制value在0,1之间并返回value。如果value小于0,返回0。如果value大于1,返回1,否则返回value 。
Mathf.Clamp限制
static function Clamp (value : float, min :float, max : float) : float
限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value
static function Clamp (value : int, min :int, max : int) : int
限制value的值在min和max之间,并返回value。
Mathf.ClosestPowerOfTwo最近的二次方
static function ClosestPowerOfTwo (value :int) : int
返回距离value最近的2的次方数。
Mathf.Cos余弦
static function Cos (f : float) : float
返回由参数 f 指定的角的余弦值(介于 -1.0 与 1.0 之间的值)。
Mathf.Deg2Rad度转弧度
static var Deg2Rad : float
度到弧度的转化常量。(只读)
这等于(PI * 2) / 360。
Mathf.Mathf.Rad2Deg 弧度转度
static var Rad2Deg : float
弧度到度的转化常量。(只读)
这等于 360 / (PI * 2)。
Mathf.DeltaAngle增量角
static function DeltaAngle (current :float, target : float) : float
计算给定的两个角之间最短的差异。
// Prints 90
Debug.Log(Mathf.DeltaAngle(1080,90));
Mathf.Epsilon小正数
static var Epsilon : float
一个很小的浮点数值。(只读)
最小的浮点值,不同于0。
以下规则:

  • anyValue + Epsilon = anyValue
  • anyValue - Epsilon = anyValue
  • 0 + Epsilon = Epsilon
  • 0 - Epsilon = -Epsilon
    一个在任意数和Epsilon的之间值将导致在任意数发生截断误差。
//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour {boolisEqual(float a, float b) {if(a >= b - Mathf.Epsilon && a <= b + Mathf.Epsilon)returntrue;elsereturnfalse;}
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.Exp指数
static function Exp (power : float) : float
返回 e 的 power 次方的值。
Mathf.FloorToInt最大整数
static function FloorToInt (f : float) :int
返回最大的整数,小于或等于f。
Mathf.Floor下限值
static function Floor (f : float) : float
返回参数 f 中指定的数字或表达式的下限值。下限值是小于等于指定数字或表达式的最接近的整数。
Mathf.Infinity正无穷
static var Infinity : float
表示正无穷,也就是无穷大,∞ (只读)
Mathf.InverseLerp反插值
计算两个值之间的Lerp参数。也就是value在from和to之间的比例值。
//现在参数是3/5
float parameter =Mathf.InverseLerp(walkSpeed, runSpeed, speed);
Mathf.IsPowerOfTwo是否2的幂
static function IsPowerOfTwo (value : int): bool
如果该值是2的幂,返回true。
// prints false
Debug.Log(Mathf.IsPowerOfTwo(7));
// prints true
Debug.Log(Mathf.IsPowerOfTwo(32));
Mathf.LerpAngle插值角度
static function LerpAngle (a : float, b :float, t : float) : float
和Lerp的原理一样,当他们环绕360度确保插值正确。
a和b是代表度数。

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour {publicfloat minAngle = 0.0F;publicfloat maxAngle = 90.0F;voidUpdate() {//北工大软院------艾孜尔江编写,使用请标明出处floatangle = Mathf.LerpAngle(minAngle, maxAngle, Time.time);transform.eulerAngles= new Vector3(0, angle, 0);}
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.Lerp插值
static function Lerp (from : float, to :float, t : float) : float
基于浮点数t返回a到b之间的插值,t限制在0~1之间。
当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。
Mathf.Log10基数10的对数
static function Log10 (f : float) : float
返回f的对数,基数为10。
Mathf.Log对数
static function Log (f : float, p : float): float
返回参数 f 的对数。
// logarithm of 6 in base 2
//以2为底6的对数
// prints 2.584963
print(Mathf.Log(6, 2));
Mathf.Max最大值
static function Max (a : float, b : float): float
static function Max (params values :float[]) : float
返回两个或更多值中最大的值。
Mathf.Min最小值
static function Min (a : float, b : float): float
static function Min (params values :float[]) : float
返回两个或更多值中最小的值。
Mathf.MoveTowardsAngle移动角
static function MoveTowardsAngle (current :float, target : float, maxDelta : float) : float
像MoveTowards,但是当它们环绕360度确保插值正确。
变量current和target是作为度数。为优化原因,maxDelta负值的不被支持,可能引起振荡。从target角推开current,添加180度角代替。
Mathf.MoveTowards移向
static function MoveTowards (current :float, target : float, maxDelta : float) : float
改变一个当前值向目标值靠近。
这实际上和 Mathf.Lerp相同,而是该函数将确保我们的速度不会超过maxDelta。maxDelta为负值将目标从推离。
Mathf.NegativeInfinity负无穷
static var NegativeInfinity : float
表示负无穷,也就是无穷小,-∞(只读)
Mathf.NextPowerOfTwo下个2的幂
Mathf.PingPong乒乓
static function PingPong (t : float, length: float) : float
0到length之间往返。t值永远不会大于length的值,也永远不会小于0。
The returned value will move back and forthbetween 0 and length.
返回值将在0和length之间来回移动。
Mathf.PI圆周率
static var PI : float
PI(读pai)的值,也就是圆周率(π)的值3.14159265358979323846…(只读)
Mathf.Pow次方
static function Pow (f : float, p : float): float
计算并返回 f 的 p 次方。
Mathf.Repeat重复
static function Repeat (t : float, length :float) : float
循环数值t,0到length之间。t值永远不会大于length的值,也永远不会小于0。
这是类似于模运算符,但可以使用浮点数。
public class example : MonoBehaviour {
voidUpdate() {
transform.position= new Vector3(Mathf.Repeat(Time.time, 3), transform.position.y,transform.position.z);
}
}
Mathf.RoundToInt四舍五入到整数
static function RoundToInt (f : float) :int
返回 f 指定的值四舍五入到最近的整数。
如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Round四舍五入
static function Round (f : float) : float
返回浮点数 f 进行四舍五入最接近的整数。
如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Sign符号
static function Sign (f : float) : float
返回 f 的符号。
当 f 为正或为0返回1,为负返回-1。
Mathf.Sin正弦
static function Sin (f : float) : float
计算并返回以弧度为单位指定的角 f 的正弦值。
Mathf.SmoothDampAngle平滑阻尼角度
static function SmoothDampAngle (current :float, target : float, ref currentVelocity : float, smoothTime : float,maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float
参数
current
当前的位置。
target
我们试图达到的位置。
currentVelocity
当前速度,这个值在你访问这个函数的时候会被随时修改。
smoothTime
the target faster.
要到达目标位置的近似时间,实际到达目标时要快一些。
maxSpeed
可选参数,允许你限制的最大速度。
deltaTime
上次调用该函数到现在的时间。缺省为Time.deltaTime。
随着时间的推移逐渐改变一个给定的角度到期望的角度。
这个值通过一些弹簧减震器类似的功能被平滑。这个函数可以用来平滑任何一种值,位置,颜色,标量。最常见的是平滑一个跟随摄像机。
//一个简单的平滑跟随摄像机
//跟随目标的朝向

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour {publicTransform target;publicfloat smooth = 0.3F;publicfloat distance = 5.0F;privatefloat yVelocity = 0.0F;voidUpdate() {
//从目前的y角度变换到目标y角度floatyAngle = Mathf.SmoothDampAngle(transform.eulerAngles.y, target.eulerAngles.y,ref yVelocity, smooth);
//target的位置Vector3position = target.position;
//然后,新角度之后的距离偏移
//北工大软院------艾孜尔江编写,使用请标明出处position+= Quaternion.Euler(0, yAngle, 0) * new Vector3(0, 0, -distance);
//应用位置transform.position= position;
//看向目标transform.LookAt(target);}
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.SmoothDamp平滑阻尼
static function SmoothDamp (current :float, target : float, ref currentVelocity : float, smoothTime : float,maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float
参数
current
当前的位置。
target
我们试图达到的位置。
currentVelocity
当前速度,这个值在你访问这个函数的时候会被随时修改。
smoothTime
要到达目标位置的近似时间,实际到达目标时要快一些。
maxSpeed
可选参数,允许你限制的最大速度。
deltaTime
上次调用该函数到现在的时间。缺省为Time.deltaTime。
描述
随着时间的推移逐渐改变一个值到期望值。
这个值就像被一个不会崩溃的弹簧减振器一样被平滑。这个函数可以用来平滑任何类型的值,位置,颜色,标量。

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour{publicTransform target;publicfloat smoothTime = 0.3F;privatefloat yVelocity = 0.0F;voidUpdate(){floatnewPosition = Mathf.SmoothDamp(transform.position.y, target.position.y, refyVelocity, smoothTime);transform.position= new Vector3(transform.position.x, newPosition, transform.position.z);}
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.SmoothStep平滑插值
static function SmoothStep (from : float,to : float, t : float) : float
和lerp类似,在最小和最大值之间的插值,并在限制处渐入渐出。

//北工大软院------艾孜尔江编写,使用请标明出处
public class example : MonoBehaviour{publicfloat minimum = 10.0F;publicfloat maximum = 20.0F;voidUpdate(){transform.position= new Vector3(Mathf.SmoothStep(minimum, maximum, Time.time), 0, 0);}
}
//北工大软院------艾孜尔江编写,使用请标明出处

Mathf.Sqrt平方根
static function Sqrt (f : float) : float
计算并返回 f 的平方根。
Mathf.Tan正切
static function Tan (f : float) : float
计算并返回以弧度为单位 f 指定角度的正切值。

艾孜尔江_Unity 3D入门常用函数用法及案例概要【干货】相关推荐

  1. Unity 3D基础入门编程_艾孜尔江撰稿

    ** 一. 版本控制 ** 目前流行的两大方式:SVN和Git: 前者采用增量式,后者采用快照式: 前者产生单点故障影响大. 安装git软件. 本地库--历史版本: 暂存区--临时存储: 工作区--写 ...

  2. Git常用命令及其作用_艾孜尔江撰

    撤销所有本次未提交的修改(相当于Tortoise Git的revert按钮): git checkout . 恢复某个已修改的文件(撤销未提交的修改): git checkout file-name ...

  3. Adobe Photoshop快捷键_艾孜尔江摘录

    矩形.椭圆选框工具 [M] 移动工具 [V] 套索.多边形套索.磁性套索 [L] 魔棒工具 [W] 裁剪工具 [C] 切片工具.切片选择工具 [K] 喷枪工具 [J] 画笔工具.铅笔工具 [B] 像皮 ...

  4. 基于GLFW的OpenGL学习001_艾孜尔江笔记

    OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集.比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小.支持的颜色位数等等.可以把对象看做一个C风格的结构 ...

  5. C++图书管理系统_艾孜尔江撰

    #include<iostream> #include<conio.h> //控制台数据输入输出的函数 #include<fstream>//文件流 #includ ...

  6. 电脑无法识别U盘的解决方式集锦_艾孜尔江撰稿

    **问题:**特定U盘无法被特定电脑识别 详述: 常年未使用的U盘在特定的一台电脑上插入时识别但在"此电脑"中无法找到. 该U盘在其他计算机设备上可以正常运行,在所谓的特定电脑上也 ...

  7. 艾孜尔江在腾讯网上的影视作品

    阳光心弦 链接地址 https://v.qq.com/x/page/v07763zvo0a.html 原谅历史 链接地址 https://v.qq.com/x/page/u07762icr5k.htm ...

  8. 生成百度网盘文件目录_艾孜尔江撰稿

    在装有百度网盘客户端并曾经至少登录过一次网盘账号的本机上找到一个名为 BaiduYunCacheFileV0.db 的文件: 使用Python脚本撰写如下代码: #!/usr/bin/env pyth ...

  9. JavaScript实现令人放松的小游戏_艾孜尔江撰

    <html><head><!-- 由艾孜尔江·艾尔斯兰复现,转载或使用请注意标明出处.全程均使用鼠标交互,原游戏创作者不详,复现时有改动.使用时请在本地路径下放置一张玩家 ...

最新文章

  1. 树莓派开发6-配置树莓派的Linux内核
  2. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 )
  3. groovy定义变量获取当前时间_IDEA不愧为神器,结合Groovy脚本,简直无敌!
  4. ajax 调用后台的方法
  5. 零基础学前端之css3高级特效
  6. python语言中print函数的作用_python中如何使用print函数
  7. 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
  8. python中英文切换_vue根据按钮进行中英文切换
  9. jupyter 服务器 显示不完全,Jupyter中显示DataFrame的行显示不完全
  10. 单生产者/单消费者 的 FIFO 无锁队列
  11. 宝塔Inode信息使用率100%满了怎么清理?
  12. 计算机cdr教程,计算机平面设计案例教程 (Photoshop+CorelDRAW)
  13. 大数据处理技术-头歌平台-答案
  14. 天龙八部,数据可视化分析虚竹和童姥居然关系非同一般
  15. 二元置信椭圆r语言_医学统计R语言:分面画boxplot
  16. 全球创见者共话企业韧性 金蝶“数字员工”惊艳亮相
  17. 香港金像奖40年发展史:香港电影最后的倔强
  18. 最大值最小值计算机一级,excel怎么找最大值和最小值 excel怎么计算最大值减最小值...
  19. 2021届前端面试知识点(其他)
  20. 电脑计算机的符号什么意思,计算机上面的符号代表什么意思  悬赏20

热门文章

  1. 微信域名防封系统-微信域名预拦截预防封
  2. protoc protoc-gen-go安装
  3. win11待机时间怎么设置 windows待机时间设置的步骤方法
  4. html如何将地址、路径、支付code_url转成二维码
  5. KDA,token.Kadena链的一些常识
  6. 豆瓣电影数据可视化大屏
  7. 【读书笔记】金字塔原理-构建金字塔的逻辑顺序
  8. 1006592-61-5,5-TAMRA Azide,5-TAMRA N3,5-羧基四甲基罗丹明-叠氮溶于有机溶剂(DMSO、DMF、二氯甲烷),水溶性低
  9. 程序中图片透明 函数
  10. Li Lei 和 Han Meimei该结婚了吧