Unity3D實現(xiàn)第一人稱移動,隨鼠標轉(zhuǎn)動視角+上樓梯(C#)
第一人稱移動:
1、在層級面板創(chuàng)建一個Capsule,命名為Player,將層級面板中的相機拖到Player下方
2、重置Player和攝像機的Transform數(shù)值(方便調(diào)整攝像機在Player上的位置),然后調(diào)整攝像機在Player上的位置
大概將攝像機放到Player眼睛的位置即可。
3、創(chuàng)建一個腳本,命名為CameraControl。并掛載到攝像機上。
代碼內(nèi)容
public class CameraControl : MonoBehaviour
{
public Transform player;//獲取玩家
private float mouseX,mouseY;//獲取鼠標位置
public float mouseSensitivity;//鼠標靈敏度
private float xRotation;
private void Update()
{
mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
xRotation -= mouseY;//在上下移動視角后,防止Y的值反彈回0(若不加這一條,每次上下移動視角移動一下后,視角都會彈回原位置,不會固定)
xRotation = Mathf.Clamp(xRotation, -70f, 70f);//攝像機上下視角限制,對于Player(主角)來說,視角上下是有限制的,不然會很詭異
player.Rotate(Vector3.up*mouseX);//玩家隨鼠標旋轉(zhuǎn)
transform.localRotation=Quaternion.Euler(xRotation,0,0);//攝像機旋轉(zhuǎn)
}
}
4、將層級的Player拖到腳本中。
效果:(圖中紅線是后面操作實現(xiàn)的,現(xiàn)在沒有是正確的)
5、對Player,刪掉默認的Colider,添加Character Controller和Rigidbody
6、調(diào)整ChararcterController中參數(shù)來讓碰撞體將Player包?。ㄖ饕{(diào)整半徑和高度)
7、創(chuàng)建一個腳本,命名為PlayerMove,掛載到Player上。
我寫的是除了前后左右移動,當按下空格鍵,會加速
public class PlayerMove : MonoBehaviour
{
// Start is called before the first frame update
private float walk;
private float run;
private float speed;
private Vector3 dir;
private CharacterController playerController;
void Start()
{
walk = 250.0f;
run = 500.0f;
playerController = GetComponent<CharacterController>();
}
void Update()
{
float vertical = Input.GetAxis("Vertical");
float horizontal = Input.GetAxis("Horizontal");
if (Input.GetKey(KeyCode.Space))
speed = run;
else
speed = walk;
dir = transform.forward * vertical + transform.right * horizontal;
playerController.Move(dir*speed*Time.deltaTime);
}
}
上樓梯(利用射線檢測)
8、在PlayerMove中添加代碼,完整代碼為文章來源:http://www.zghlxwxcb.cn/news/detail-539105.html
public class PlayerMove : MonoBehaviour
{
private float walk;
private float run;
private float speed;
private Vector3 dir;
private Vector3 dirY;
private CharacterController playerController;
private Vector3 rayOrigin;
private Ray ray;
void Start()
{
walk = 250.0f;
run = 500.0f;
playerController = GetComponent<CharacterController>();
}
void Update()
{
float vertical = Input.GetAxis("Vertical");
float horizontal = Input.GetAxis("Horizontal");
if (Input.GetKey(KeyCode.Space))
speed = run;
else
speed = walk;
dir = transform.forward * vertical + transform.right * horizontal;
playerController.Move(dir*speed*Time.deltaTime);
rayOrigin = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z) +
this.transform.forward * speed;
ray.origin = rayOrigin;
ray.direction = new Vector3(0, -1, 0);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Debug.DrawLine(ray.origin,hit.point,Color.red);
}
dirY.y = -this.transform.position.y+ hit.point.y;
playerController.Move(dirY);
}
9、一定要將每個臺階加上碰撞體
最終運行效果:文章來源地址http://www.zghlxwxcb.cn/news/detail-539105.html
到了這里,關于Unity3D實現(xiàn)第一人稱移動,隨鼠標轉(zhuǎn)動視角+上樓梯(C#)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!