スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

キャラ操作とカメラのスクリプト公開(//∇//)

注釈を付け終わったスクリプトを公開しますね。
配置が崩れてしまってて見にくいですが(>_<)
全部終わったらプロジェクトファイルごと公開する予定。

スクリプトでおかしいところやこうした方がいいというアドバイスあれば教えてください。
これで完成というわけではなくてもっと良くします。特にカメラ。


■キャラ操作(プレイヤーキャラクターのGameObjectに付けるスクリプト)
※CharacterControllerとBarrett_Status(スクリプト)も同じGameObjectについている状態です

// プレイヤーの移動スクリプト

var walkSpeed : float = 7.0; // 移動速度
var jumpSpeed : float = 10.0; // ジャンプ速度
var gravity : float = 20.0; // 重力加速度
private var moveDirection : Vector3 = Vector3.zero; // 移動方向
private var playerDirection : Vector3 = Vector3.zero; //プレイヤーの向き
private var grounded : boolean = false; // 接地フラグ
var isControllable : boolean = true; // 操作可能かのフラグ

//CharacterControllerコンポーネントを取得
var controller : CharacterController;
controller = GetComponent(CharacterController);

//Barrett_Statusコンポーネントを取得
var barrettStatus : Barrett_Status;
barrettStatus = GetComponent(Barrett_Status);

function FixedUpdate()
{
if(!isControllable){ //操作不可の場合
Input.ResetInputAxes(); //入力を0にする

}else{ //操作可の場合

if(grounded){ // 接地している場合
moveDirection.y = -0.1;
// ×ボタンでジャンプ
if (Input.GetButtonDown("Batu")) {
moveDirection.y = jumpSpeed;
}

}else{ //接地していない場合
//y方向の速度を重力加速度で引く
moveDirection.y -= gravity * Time.deltaTime;
}

//カメラのtransformを取得
var cameraTransform : Transform = Camera.main.transform;
//カメラの前向きをworldに変換
var forward : Vector3 = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0; //y方向を無くす
forward = forward.normalized; //単位ベクトルに直す
var right = Vector3(forward.z, 0, -forward.x); //右向きを計算
var v = Input.GetAxisRaw("Vertical"); //入力を取得
var h = Input.GetAxisRaw("Horizontal"); //入力を取得
playerDirection = h * right + v * forward; //入力をカメラの向きに直す

//入力がある程度あればその方向にプレイヤーを向ける
if (playerDirection.magnitude > 0.1) {
transform.rotation = Quaternion.LookRotation(playerDirection);
}

playerDirection *= walkSpeed; //移動速度を掛ける
playerDirection += Vector3(0, moveDirection.y, 0); //y方向の値を加える
//移動する ※Move関数は他のコライダとの接触を戻り値として返す
var flags = controller.Move(playerDirection * Time.deltaTime);
//接地を調べる
grounded = ((flags & CollisionFlags.CollidedBelow) != 0);
}
}

//プレイヤーが動いているかを返す
function IsMoving()
{
return playerDirection.magnitude > 0.5;
}

//接地しているかを返す
function IsGrounded()
{
return grounded;
}


■カメラ(このスクリプトはどこに付けてもOKです)

//カメラのスクリプト

var normalCamera : GameObject; //カメラ
var lockMarkPrefab : GameObject; //ロックカーソルのプレハブ
var bulletSpawn : GameObject; //弾が発射されるポイント
var locktarget : Transform; //ロックオン対象
var xspeed : float = 30; //カメラを左右に振る速度
var yspeed : float = 100; //カメラを上下に振る速度
var playerObj : Transform; //プレイヤー
var xDistance = 1.0; //プレイヤーからカメラまでのx方向距離
var zDistance = 5.0; //プレイヤーからカメラまでのz方向距離
var yDistance = 2.0; //プレイヤー(足元)からのy方向距離
var xMinLimit = -20; //カメラが見上げられる最低角度
var xMaxLimit = 45; //カメラが見上げられる最高角度

private var y = 0.0; //カメラのy軸のrotation
private var x = 0.0; //カメラのx軸のrotation
private var lockMark : GameObject; //インスタンスされたロックマーク格納用
private var lockOn = false; //ロックオンフラグ

function Start ()
{
// カメラを見つける
if (!normalCamera){
normalCamera = GameObject.FindWithTag("MainCamera");
}

//プレイヤーを見つける
if (!playerObj){
playerObj = GameObject.FindWithTag("Player").transform;
}
}

function Update()
{
if (Input.GetButtonDown("L1")) { //L1が押された場合
if (lockOn == false && locktarget){ //非ロックオン、かつターゲットがある場合
LockON(); //ロックオンする
}else{ //ロックオン中、もしくはターゲットがない場合
LockOFF(); //ロックオン解除する
}
}

if (lockOn == true){ //ロックオン中の場合

if (!locktarget){ //ロックターゲットがない場合
LockOFF(); //ロックオン解除する
}else{ //ロックターゲットがある場合
bulletSpawn.transform.LookAt(locktarget); //バスターの発射方向を敵の方にする
//y軸周りの角度を求めている
var dx = locktarget.position.x - playerObj.transform.position.x;
var dz = locktarget.position.z - playerObj.transform.position.z;
y = Mathf.Atan2(dx, dz) * Mathf.Rad2Deg;
//カメラ移動・回転
MoveCamera(0.0, y);
//ロックマークをロックターゲットの位置に移動し、カメラの方を向かせる
lockMark.transform.position = locktarget.position;
lockMark.transform.LookAt(normalCamera.transform);
}
}else{ //非ロックオンの場合
//入力をangleに代入
var angle : Vector3 = Vector3(Input.GetAxis("Right_X"), 0, Input.GetAxis("Right_Y"));
//入力量に応じて角度を加える
if (angle.magnitude > 0.1) {
y += Input.GetAxis("Right_X") * xspeed * 0.08;
x += Input.GetAxis("Right_Y") * yspeed * 0.01;
}
//上下の角度を制限する
x = ClampAngle(x , xMinLimit, xMaxLimit);
//カメラ移動・回転
MoveCamera(x, y);

}
}

//ロックオンする関数
function LockON()
{
lockOn = true; //ロックオン
//ロックマークをターゲットの位置にインスタンス化
lockMark = Instantiate(lockMarkPrefab, locktarget.position, transform.rotation);
}

//ロックオン解除する関数
function LockOFF()
{
lockOn = false; //ロックオン解除
Destroy (lockMark); //ロックマークを削除
//バスターの発射方向を正面に戻す
bulletSpawn.transform.localRotation.x = 0;
bulletSpawn.transform.localRotation.y = 0;
//正面を向く
x = 0.0;
}

//カメラ移動・回転の関数
function MoveCamera(x : float, y : float)
{
normalCamera.transform.rotation = Quaternion.Euler(x, y, 0);
normalCamera.transform.position = Quaternion.Euler(x, y, 0)
* Vector3(xDistance, yDistance, -zDistance) + playerObj.position;
}

//角度を制限する関数
static function ClampAngle (angle : float, min : float, max : float)
{
return Mathf.Clamp (angle, min, max);
}
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

コブン0号

Author:コブン0号
開発中止になってしまったDASH3復活を願ってゲームを製作中です。
Unity, Blender, Illustrator, GIMP, Aviutl等を勉強中です。
ツイッター:https://twitter.com/KobunNo0
メール:jisaku.dash3(半角アットマーク)gmail.com

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。