[Unity] 經常使用技巧收集

Unity 屏幕旋轉async

void Update () {
 
//處理橫向兩個方向旋轉
 
if(Input.deviceOrientation == DeviceOrientation.LandscapeLeft)
 
{
 
if (Screen.orientation != ScreenOrientation.LandscapeLeft) {
 
Screen.orientation = ScreenOrientation.LandscapeLeft;
 
}
 
}else if(Input.deviceOrientation == DeviceOrientation.LandscapeRight)
 
{
 
if (Screen.orientation != ScreenOrientation.LandscapeRight) {
 
Screen.orientation = ScreenOrientation.LandscapeRight;
 
}
 
}else
 
//處理縱向兩個方向的旋轉
 
if(Input.deviceOrientation == DeviceOrientation.Portrait)
 
{
 
if (Screen.orientation != ScreenOrientation.Portrait) {
 
Screen.orientation = ScreenOrientation.Portrait;
 
}
 
}else if(Input.deviceOrientation == DeviceOrientation.PortraitUpsideDown)
 
{
 
if (Screen.orientation != ScreenOrientation.PortraitUpsideDown) {
 
Screen.orientation = ScreenOrientation.PortraitUpsideDown;
 
}
 
}
 
}

 

Unity 鏡頭拉近效果(帶緩衝)

var target : Transform;
 
var distance : float = 3.0;
 
var height : float = 1.0;
 
var damping : float = 5.0;
 
var smoothRotation : boolean = true;
 
var rotationDamping : float = 10.0;
 
var targetLookAtOffset : Vector3;     // allows offsetting of camera lookAt, very useful for low bumper heights
 
var bumperDistanceCheck : float = 2.5;  // length of bumper ray
 
var bumperCameraHeight : float = 1.0;   // adjust camera height while bumping
 
var bumperRayOffset : Vector3;    // allows offset of the bumper ray from target origin
 
function FixedUpdate() {
 
var wantedPosition = target.TransformPoint(0, height, -distance);
 
// check to see if there is anything behind the target
 
var hit : RaycastHit;
 
var back = target.transform.TransformDirection(-1 * Vector3.forward);
 
// cast the bumper ray out from rear and check to see if there is anything behind
 
if (Physics.Raycast(target.TransformPoint(bumperRayOffset), back, hit, bumperDistanceCheck)) {
 
// clamp wanted position to hit position
 
wantedPosition.x = hit.point.x;
 
wantedPosition.z = hit.point.z;
 
wantedPosition.y = Mathf.Lerp(hit.point.y + bumperCameraHeight, wantedPosition.y, Time.deltaTime * damping);
 
}
 
transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping);
 
var lookPosition : Vector3 = target.TransformPoint(targetLookAtOffset);
 
if (smoothRotation) {
 
var wantedRotation : Quaternion = Quaternion.LookRotation(lookPosition - transform.position, target.up);
 
transform.rotation = Quaternion.Slerp(transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
 
} else {
 
transform.rotation = Quaternion.LookRotation(lookPosition - transform.position, target.up);
 
}
 
}

 

Untiy 動畫加速

for (var state : AnimationState in animation)
 
{
 
state.speed = 0.5;
 
}

 

Unith3D判斷物體是否在視角內

public var isRendering:boolean=false;
 
private var lastTime:float=0;
 
private var curtTime:float=0;
 
function Update()
 
{
 
isRendering=curtTime!=lastTime?true:false;
 
lastTime=curtTime;
 
}
 
function OnWillRenderObject()
 
{
 
curtTime=Time.time;
 
}

 

如何判斷Unity3D角色動做播放結束

bool AnimationStillPlaying( string animationName )

  {

  return _animation.IsPlaying(animationName) && _animation[animationName].normalizedTime<1.0f;

  }

  normalizedTime: 範圍0 -- 1,  0是動做開始,1是動做結束

 

利用Quaternion.LookRotation API 將旋轉矩陣轉換成四元數

Quaternion.LookRotation

  private static Quaternion QuaternionLookRotation(Vector3 forward, Vector3 up)

  {

  forward.Normalize();

  Vector3 vector = Vector3.Normalize(forward);

  Vector3 vector2 = Vector3.Normalize(Vector3.Cross(up, vector));

  Vector3 vector3 = Vector3.Cross(vector, vector2);

  var m00 = vector2.x;

  var m01 = vector2.y;

  var m02 = vector2.z;

  var m10 = vector3.x;

  var m11 = vector3.y;

  var m12 = vector3.z;

  var m20 = vector.x;

  var m21 = vector.y;

  var m22 = vector.z;

  float num8 = (m00 + m11) + m22;

  var quaternion = new Quaternion();

  if (num8 > 0f)

  {

  var num = (float)Math.Sqrt(num8 + 1f);

  quaternion.w = num * 0.5f;

  num = 0.5f / num;

  quaternion.x = (m12 - m21) * num;

  quaternion.y = (m20 - m02) * num;

  quaternion.z = (m01 - m10) * num;

  return quaternion;

  }

  if ((m00 >= m11) && (m00 >= m22))

  {

  var num7 = (float)Math.Sqrt(((1f + m00) - m11) - m22);

  var num4 = 0.5f / num7;

  quaternion.x = 0.5f * num7;

  quaternion.y = (m01 + m10) * num4;

  quaternion.z = (m02 + m20) * num4;

  quaternion.w = (m12 - m21) * num4;

  return quaternion;

  }

  if (m11 > m22)

  {

  var num6 = (float)Math.Sqrt(((1f + m11) - m00) - m22);

  var num3 = 0.5f / num6;

  quaternion.x = (m10+ m01) * num3;

  quaternion.y = 0.5f * num6;

  quaternion.z = (m21 + m12) * num3;

  quaternion.w = (m20 - m02) * num3;

  return quaternion;

  }

  var num5 = (float)Math.Sqrt(((1f + m22) - m00) - m11);

  var num2 = 0.5f / num5;

  quaternion.x = (m20 + m02) * num2;

  quaternion.y = (m21 + m12) * num2;

  quaternion.z = 0.5f * num5;

  quaternion.w = (m01 - m10) * num2;

  return quaternion;

  }

 

Unity3D判斷場景是否加載完成

加載場景時要用

  public static AsyncOperation async;

  async = Application.LoadLevelAsync(「SelectCarModelScreen」);

  在加載場景裏寫

  if (MainInterfaceGUIScript.async.isDone == false)

  {

  //________沒 有加載完要作的事情如Logo__________________________

  }

  else

  {

  //所有加載完成後顯示的東東。。

  }

  說明一點這種方法消耗性能哦

 

物體運動到指定位置

int smooth = 2;

  Quaternion target = Quaternion.Euler(0, 0, 0);//目標

  // Dampen towards the target rotation

  transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);

  《《《《《《《《《《《《《《鼠標左鍵地形  物體移動至點擊位置》》》》》》》》》》》》》

  var moveSpeed:int=5;//player移動速度

  var player:Transform;//定義一我的物的Transform

  private var endposition : Vector3;

  function Start()

  {

  endposition = player.transform.position;

  }

  function Update ()

  {

  if(Input.GetButtonUp("LeftMouse")){ //LeftMouse是在inputManager中設置的,左鍵值爲mouse 0

  PlayerMove();

  }

  var targetposition=player.TransformPoint(Vector3(0,48.8,-30));

  transform.position=targetposition;//相機的目標位置,這兩句代碼的做用是讓人物一直處於相機的視野下

  if(endposition != player.transform.position){

  player.position=Vector3.MoveTowards(player.position,endposition,Time.deltaTime*moveSpeed);

  }

  }

  function PlayerMove()

  {

  var cursorScreenPosition:Vector3=Input.mousePosition;//鼠標在屏幕上的位置

  var ray:Ray=Camera.main.ScreenPointToRay(cursorScreenPosition);//在鼠標所在的屏幕位置發出一條射線(暫名該射線爲x射線)

  var hit:RaycastHit;

  if(Physics.Raycast(ray,hit)){

  if(hit.collider.gameObject.tag=="Terrain"){//設置地形Tag爲Terrain

  endposition = hit.point;

  }

  }

  }

 

射線測試+使用手勢判斷是否觸碰了某物體

using unityEngine;

  using System.Collections;

  public class Lu : MonoBehaviour

  {

  public Camera cam;

  // We need to actually hit an object

  RaycastHit hitt = new RaycastHit();

  // Use this for initialization

  void Start()

  {

  }

  // Update is called once per frame

  void Update()

  {

  Ray ray = cam.ScreenPointToRay(Input.mousePosition);

  Physics.Raycast(ray, out hitt, 100);

  // Debug.DrawLine(cam.transform.position, ray.direction,Color.red);

  if (null != hitt.transform)

  {

  print(hitt.point);//鼠標點擊的座標

  }

  }

  }

  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

  必須給物體添加碰撞器,好比Box Collider

  而後在Update中檢測手勢,此處假設爲手指在屏幕上移動

  主相機的視角(Camera.main)從手指移動處(Input.GetTouch(0).position)發射射線,設置射線發射距離。

  當射線碰撞到了帶有碰撞器的物體,就會存儲該物體的信息。

  [csharp] view plaincopy

  void  Update(){

  if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved){

  Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch(0).position);

  //hit用來存儲碰撞物體的信息

  RaycastHit hit;

  //ray表示射線,hit存儲物體的信息,1000爲設定射線發射的距離

  if(Physics.Raycast (ray, out hit, 1000)){

  print(hit.transform.name.ToString());

  }

  }

  }

 

實例來建立對象

//Simple Instantiation of a Prefab at Start

  var thePrefab : GameObject;

  function Start () {

  var instance : GameObject = Instantiate(thePrefab, transform.position, transform.rotation);

  }

  創建JAVA,把代碼拖入到空GameJect上,而後把Prefab拖入到公共變量上,就能夠了

 

聲音播放 座標轉換

var cAudio:AudioClip;
 
function Update(){
 
}
 
function OnMouseDown () {
 
var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
 
var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,transform.position.y, screenSpace.z));
 
while (Input.GetMouseButton(0)){
 
var curScreenSpace = Vector3(Input.mousePosition.x, transform.position.y, screenSpace.z);
 
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
 
if(curPosition!=transform.position){
 
audio.Stop();
 
audio.clip = cAudio;
 
audio.Play();
 
}
 
transform.position = curPosition;
 
yield;
 
}
 
}

 

 

射線 (之鼠標點擊的座標)

using UnityEngine;
 
using System.Collections;
 
public class Lu : MonoBehaviour
 
{
 
public Camera cam;
 
// We need to actually hit an object
 
RaycastHit hitt = new RaycastHit();
 
// Use this for initialization
 
void Start()
 
{
 
}
 
// Update is called once per frame
 
void Update()
 
{
 
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
 
Physics.Raycast(ray, out hitt, 100);
 
//    Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
 
if (null != hitt.transform)
 
{
 
print(hitt.point);//鼠標點擊的座標
 
}
 
}
 
}

 

拖拽物體的腳本

function OnMouseDown () {

  var screenSpace = Camera.main.WorldToScreenPoint(transform.position);

  var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

  while (Input.GetMouseButton(0))

  {

  var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

  var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

  transform.position = curPosition;

  yield;

  }

  }

 

用指定圖片替換鼠標指針

//用指定圖片替換鼠標指針
 
var mouse:Texture;
 
function Update(){
 
Screen.showCursor=false;//隱藏鼠標指針
 
}
 
function OnGUI{
 
var msPos=Input.mousePosition;//鼠標的位置
 
GUI.DrawTexture(Rect(msPos.x,Screen.height-msPos.y,20,20),mouse);
 
}

 

Unity 字體描邊

private void MakeStroke(Rect position,string txtString,Color txtColor,Color outlineColor,int outlineWidth )

  {

  position.y-= outlineWidth;

  GUI.color=outlineColor;

  GUI.Label(position, txtString);

  position.y+=outlineWidth*2;

  GUI.Label(position, txtString);

  position.y-=outlineWidth;

  position.x-=outlineWidth;

  GUI.Label(position, txtString);

  position.x+=outlineWidth*2;

  GUI.Label(position, txtString);

  position.x-=outlineWidth;

  GUI.color=txtColor;

  GUI.Label(position, txtString);

  }

 

調用外部的EXE和載入關卡

using unityEngine;

  using System.Collections;

  public class openexe: MonoBehaviour {

  // Use this for initialization

  void Start () {

  System.Diagnostics.ProcessStartInfo  Info  =  new  System.Diagnostics.ProcessStartInfo();

  Info.FileName  =  "C:\\Program Files\\Autodesk\\3dsMax8\\3dsmax.exe";

  System.Diagnostics.Process.Start(Info);

  }

  // Update is called once per frame

  void Update () {

  }

  }

  -----------------載入關卡--------------

  function OnGUI ()

  {

  if (GUI.Button(new Rect(400,400,100,20),"Start"))

  {

  Application.LoadLevel(1);

  }

  }
相關文章
相關標籤/搜索