2014年8月25日 星期一

計時器搭配物件旋轉

Unity Web Player | New Unity Project



製作圖片:

---------------------------------------------------------------------------------

程式部分 :

螺旋槳腳本:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

public float speed = 0f;

float timer_f;
int timer_i;

// Update is called once per frame
void Update () {

timer_f = Time.time;
timer_i = Mathf.FloorToInt (timer_f);

Debug.Log (timer_i);

if(timer_i != 0){

transform.Rotate(Vector3.up * Time.deltaTime * speed);

speed += 1;

}
if(speed >= 800){
speed = 800;
transform.Rotate(Vector3.up * Time.deltaTime * speed);
}
}

void OnGUI(){
if(GUI.Button(new Rect(Screen.width/Screen.width, Screen.height/Screen.height, 100, 50),"return")){
Application.LoadLevel("AAABBB");
}
}
}

攝影機腳本:

var target : Transform;
var distance = 10.0;

var xSpeed = 250.0;
var ySpeed = 120.0;

var yMinLimit = -20;
var yMaxLimit = 80;

private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Mouse Orbit")

function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;

// Make the rigid body not change rotation
    if (GetComponent.<Rigidbody>())
GetComponent.<Rigidbody>().freezeRotation = true;
}

function LateUpdate () {
    if (target) {
        x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
        y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
 
  y = ClampAngle(y, yMinLimit, yMaxLimit);
        
        var rotation = Quaternion.Euler(y, x, 0);
        var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
        
        transform.rotation = rotation;
        transform.position = position;
    }
}

static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}

2014年8月14日 星期四

Unity 滑鼠控制角色移動 - 射線及Animator 動畫控制方法

Unity Web Player | New Unity Project

匯入模型後請把RIG 按鈕底下 Animation type 選擇 Humanoid 在按下Apply。

 

再Project 視窗按下右鍵建立 Animator Controller ,在點兩下就會進入Animator 
編輯視窗。

把模型動畫以動作邏輯順序方式拖曳進去Animator 編輯視窗。


再動畫編輯區塊按下右鍵選擇Make Transitionm,會出現
箭頭再指向另一個動畫編輯區塊。

※ 注意: 箭頭方向一定要注意動畫編輯區塊的正確位置。
  箭頭方向位置表示動畫撥放的動畫區塊。


之後再Parameters 視窗 點選上面的" + " 這個符號,
再選擇所需的程式控制的基本型別,選完型別後
把型別視窗命名。

※注意: 在這裡我使用Boolean 型別 程式控制:  SetBool。
Float 型別 程式控制: SetFloat。                
Int 型別 程式控制: SetInteger。                 
Trigger 類型 程式控制: SetTrigger。           
               命名很重要 程式控制的地方及數值,特別注意。        
     

再點選箭頭後,旁編列會出現箭頭所需編輯視窗。
Condition 屬性視窗選擇,型別命名名稱,再調整所需數值。

※注意: Condition 屬性視窗的數值,由程式撰寫那邊控制設定。


角色屬性設定呈現方式:
以看圖方式呈現。








--------------------------------------------
程式部分:

角色控制類別:

using UnityEngine;
using System.Collections;

public class TestPlayerAnimation : MonoBehaviour {

public float speed;
public CharacterController playerController;

private Vector3 position;

public Animator playerAnimation;

// Use this for initialization
void Start () {
position = transform.position;
playerAnimation.GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
locatePotation();
}
moveToPosition ();
}
void locatePotation(){

RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);

if(Physics.Raycast(ray, out hit, 1000)){
position = new Vector3(hit.point.x, hit.point.y, hit.point.z);
}
}
void moveToPosition(){

if(Vector3.Distance(transform.position, position)>3){

Quaternion newRotation = Quaternion.LookRotation (position - transform.position, Vector3.forward);

newRotation.x = 0f;
newRotation.z = 0f;

transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, Time.deltaTime * 10);
playerController.SimpleMove(transform.forward * speed);

playerAnimation.SetBool("Test",true);
Debug.Log("ok");
}else{
playerAnimation.SetBool("Test",false);
                        Debug.Log("no");
}
}
}

攝影機類別:

// The target we are following
var target : Transform;
// The distance in the x-z plane to the target
var distance = 10.0;
// the height we want the camera to be above the target
var height = 5.0;
// How much we 
var heightDamping = 2.0;
//var rotationDamping = 3.0;

// Place the script in the Camera-Control group in the component menu
@script AddComponentMenu("Camera-Control/Smooth Follow")


function LateUpdate () {
// Early out if we don't have a target
if (!target)
return;
// Calculate the current rotation angles
//var wantedRotationAngle = target.eulerAngles.y;
var wantedHeight = target.position.y + height;
var currentRotationAngle = transform.eulerAngles.y;
var currentHeight = transform.position.y;
// Damp the rotation around the y-axis
// currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

// Damp the height
currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);

// Convert the angle into a rotation
// var currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
// Set the position of the camera on the x-z plane to:
// distance meters behind the target
transform.position = target.position;
// transform.position -= currentRotation * Vector3.forward * distance;
transform.position -= Vector3.forward * distance;

// Set the height of the camera
transform.position.y = currentHeight;
// Always look at the target
transform.LookAt (target);
}