「Unity/3d/キャラクタ移動/前後回転」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→前後移動で左右で回転) |
|||
| 行12: | 行12: | ||
GameObject cam; | GameObject cam; | ||
Quaternion cameraRot, characterRot; | Quaternion cameraRot, characterRot; | ||
| − | |||
| − | |||
float minX = -90f, maxX = 90f; | float minX = -90f, maxX = 90f; | ||
void Start() | void Start() | ||
2022年12月12日 (月) 04:27時点における版
前後移動で左右で回転するサンプル
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterControl : MonoBehaviour
{
float x, z;
float speed = 0.1f;
float rotate_speed = 1f;
GameObject cam;
Quaternion cameraRot, characterRot;
float minX = -90f, maxX = 90f;
void Start()
{
cam = GameObject.Find("Main Camera");
cameraRot = cam.transform.localRotation;
characterRot = transform.localRotation;
}
void Update()
{
float xRot = Input.GetAxisRaw("Horizontal") * rotate_speed;
characterRot *= Quaternion.Euler(0, xRot, 0);
cameraRot = ClampRotation(cameraRot);
transform.localRotation = characterRot;
}
private void FixedUpdate()
{
x = 0;
z = Input.GetAxisRaw("Vertical") * speed;
transform.position += cam.transform.forward * z + cam.transform.right * x;
}
public Quaternion ClampRotation(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1f;
float angleX = Mathf.Atan(q.x) * Mathf.Rad2Deg * 2f;
angleX = Mathf.Clamp(angleX, minX, maxX);
q.x = Mathf.Tan(angleX * Mathf.Deg2Rad * 0.5f);
return q;
}
}
