Unity3D範例之1.FPSWalker

FPSWalker.cs

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]  
//js->@script RequireComponent(CharacterController)
public class FPSWalker : MonoBehaviour {
 //請不要在這裡就將參數初始化 
 public float speed = 6.0f;
 public float jumpSpeed = 8.0f;
 public float gravity = 20.0f;
 private Vector3 moveDirection = Vector3.zero;
 private bool grounded = false;
 // Use this for initialization
 void Start () {
   //一定要在Start或Awake裡面做初始化,這樣才不會有參數值更改無效的問題
   speed = 6.0f;
   jumpSpeed = 8.0f;
   gravity = 20.0f;
   moveDirection = Vector3.zero;
   grounded = false;
 }
 
 // Update is called once per frame
 void FixedUpdate () {
  if(grounded){
   //取得自身座標
   moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")); 
   //轉換自身座標為世界座標
   moveDirection = transform.TransformDirection(moveDirection);  
   //x,y,z向量值乘與speed                        
   moveDirection *= speed;
   
   //有按到Edit-Project Settings-Input中Jump所定義的按鍵 
   if(Input.GetButton("Jump")){
    moveDirection.y = jumpSpeed;
   }
  }
  //重力效果
  moveDirection.y -= gravity * Time.deltaTime;
  //取得腳色控制
  CharacterController controller = GetComponent();
  //移動腳色
  CollisionFlags flags = controller.Move(moveDirection*Time.deltaTime);
  //是否還有接觸地面
  grounded = ((flags & CollisionFlags.CollidedBelow) != 0);
  
  /* 另一種寫法 
  CharacterController controller = GetComponent();
  if(controller.isGrounded){
    moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")); 
    moveDirection = transform.TransformDirection(moveDirection);
    moveDirection *= speed;  //operator *  
   
    if(Input.GetButton("Jump")){
      moveDirection.y = jumpSpeed;
    }
  }
  moveDirection.y -= gravity * Time.deltaTime;
  controller.Move(moveDirection*Time.deltaTime); 
  */
 }
}

留言

這個網誌中的熱門文章

C# 調用 C/C++ DLL 資料型態之對應

在Ubuntu上安裝EZ100PU晶片讀卡機