Unity3d工具方法小集
1、获取垂直水平方向上的输入:
float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical");
2、给刚体一个力:
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); GetComponent<Rigidbody>().AddForce(movement * speed * Time.deltaTime);
3、摄像头45度俯视角:
Camera:
Position: x(0) y(5) z(-6) Rotate: x(45) y(0) z(0) Scale: x(1) y(1) z(1)
4、摄像机跟随:
public GameObject player; private Vector3 offset; // Use this for initialization void Start () { //摄像机与跟随物体的初始相对位置 offset = transform.position - player.transform.position; } // Update is called once per frame void LateUpdate () { //跟随物体的位置加上相对位置 transform.position = player.transform.position + offset; }
5、物体自己旋转(固定时间,跟幀率无关):
void Update () { transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime); }
6、检测碰撞(且碰撞后对方消失):
private void OnTriggerEnter(Collider other) { //这里的TAG为对方物体Tag if (other.gameObject.CompareTag(TAG)) { //要让对方消失,对方物体要设置为碰撞触发器(即IsTrigger属性要为true) other.gameObject.SetActive(false); } }
7、设置Button里的Text值
GetComponentInChildren<Text>().text = "";
8、移除刚体上的力:
GetComponent<Rigidbody>().velocity = Vector3.zero;
GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
9、背景滾动:
using UnityEngine; public class BGScroller : MonoBehaviour { public float scrollSpeed; public float tileSizeZ; private Vector3 startPosition; void Start () { startPosition = transform.position; } void Update () { float newPosition = Mathf.Repeat(Time.time * scrollSpeed, tileSizeZ); transform.position = startPosition + Vector3.forward * newPosition; } }
10、出边界后销毀:
using UnityEngine; public class DestoryByBoundary : MonoBehaviour { void OnTriggerExit(Collider other) { Destroy(other.gameObject); } }
11、把prefabs放入场景中:
Instantiate(object, position, rotation);
12、一定时间后销毁:
using UnityEngine; public class DestoryByTime : MonoBehaviour { public float lifetime; void Start () { Destroy(gameObject, lifetime); } }
13、游戏开始等待一定时间,过程中时间间隔,每一关时间间隔:
void Start() { StartCoroutine (SpawnWaves()); } IEnumerator SpawnWaves() { yield return new WaitForSeconds(startWait); while (true) { playerObject.GetComponent<PlayerController>().SetFireByLevel(level); for (int i = 0; i < hazardCount; i++) { GameObject hazard = hazards[Random.Range(0, hazards.Length)]; Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z); Quaternion spawnRotation = Quaternion.identity; Instantiate(hazard, spawnPosition, spawnRotation); yield return new WaitForSeconds(spawnWait); } level++; yield return new WaitForSeconds(waveWait); if (gameOver) { restartButton.SetActive(true); restart = true; break; } } }
14、加载场景:
SceneManager.LoadScene("_Scenes/Main", LoadSceneMode.Single);
15、物体倾斜:
rb.rotation = Quaternion.Euler(0.0f, 0.0f, rb.velocity.x * -tilt);
16、随机旋转:
GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere * tumble;
tumble在5左右。
17、开火触模板:
using UnityEngine; using UnityEngine.EventSystems; public class SimpleTouchAreaButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { private bool touched; private int pointerID; private bool canFire; void Awake() { touched = false; canFire = false; } public void OnPointerDown(PointerEventData eventData) { if (!touched) { touched = true; pointerID = eventData.pointerId; canFire = true; } } public void OnPointerUp(PointerEventData eventData) { if (eventData.pointerId == pointerID) { canFire = false; touched = false; } } public bool CanFire() { return canFire; } }
18、位置方向触模板:
using UnityEngine; using UnityEngine.EventSystems; public class SimpleTouchPad : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler { public float smoothing; private Vector2 origin; private Vector2 direction; private Vector2 smoothDirection; private bool touched; private int pointerID; void Awake() { direction = Vector2.zero; touched = false; } public void OnPointerDown(PointerEventData eventData) { if (!touched) { touched = true; pointerID = eventData.pointerId; //set our start point origin = eventData.position; } } public void OnDrag(PointerEventData eventData) { if (eventData.pointerId == pointerID) { //compare the difference between our start point and current pointer pos Vector2 currentPosition = eventData.position; Vector2 directionRaw = currentPosition - origin; direction = directionRaw.normalized; } } public void OnPointerUp(PointerEventData eventData) { if (eventData.pointerId == pointerID) { //reset everything direction = Vector2.zero; touched = false; } } public Vector2 GetDirection() { smoothDirection = Vector2.MoveTowards(smoothDirection, direction, smoothing); return smoothDirection; } }
19、延迟重复执行:
InvokeRepeating("Fire", delay, fireRate);
20、向目标靠近:
using System.Collections; using UnityEngine; public class EvasiveManeuver : MonoBehaviour { public float dodge; public float smoothing; public float tilt; public Vector2 startWait; public Vector2 maneuverTime; public Vector2 maneuverWait; public Boundary boundary; private Transform playTransform; private float currentSpeed; private float targetManeuver; private Rigidbody rb; void Start () { rb = GetComponent<Rigidbody>(); GameObject playerObject = GameObject.FindGameObjectWithTag("Player"); if (playerObject != null) { playTransform = playerObject.transform; } currentSpeed = rb.velocity.z; StartCoroutine(Evade()); } IEnumerator Evade() { yield return new WaitForSeconds(Random.Range(startWait.x, startWait.y)); while(true) { targetManeuver = Random.Range(1, dodge) * -Mathf.Sign(transform.position.x); if (playTransform != null) { targetManeuver = playTransform.position.x; } yield return new WaitForSeconds(Random.Range(maneuverTime.x, maneuverTime.y)); targetManeuver = 0; yield return new WaitForSeconds(Random.Range(maneuverWait.x, maneuverWait.y)); } } void FixedUpdate () { float newManeuver = Mathf.MoveTowards(rb.velocity.x, targetManeuver, Time.deltaTime * smoothing); rb.velocity = new Vector3(newManeuver, 0.0f, currentSpeed); rb.position = new Vector3( Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax), 0.0f, Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax) ); rb.rotation = Quaternion.Euler(0.0f, 0.0f, rb.velocity.x * tilt); } }
21、给按钮绑定事件: