تحكم سفينة الفضاء في الوحدة
في هذا البرنامج التعليمي، سأوضح كيفية إنشاء وحدة تحكم لسفينة الفضاء في Unity.
هيا نبدأ!
خطوات
- ضع نموذج spaceship في المشهد الخاص بك
- قم بإنشاء GameObject جديد، أطلق عليه اسم "Spaceship"
- انقل نموذج سفينة الفضاء داخل الكائن "Spaceship" وقم بتغيير موضعه إلى (0، 0، 0)
- قم بإنشاء سكريبت جديد، وأطلق عليه اسم "SC_SpaceshipController" والصق الكود أدناه داخله:
SC_SpaceshipController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class SC_SpaceshipController : MonoBehaviour
{
public float normalSpeed = 25f;
public float accelerationSpeed = 45f;
public Transform cameraPosition;
public Camera mainCamera;
public Transform spaceshipRoot;
public float rotationSpeed = 2.0f;
public float cameraSmooth = 4f;
public RectTransform crosshairTexture;
float speed;
Rigidbody r;
Quaternion lookRotation;
float rotationZ = 0;
float mouseXSmooth = 0;
float mouseYSmooth = 0;
Vector3 defaultShipRotation;
// Start is called before the first frame update
void Start()
{
r = GetComponent<Rigidbody>();
r.useGravity = false;
lookRotation = transform.rotation;
defaultShipRotation = spaceshipRoot.localEulerAngles;
rotationZ = defaultShipRotation.z;
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void FixedUpdate()
{
//Press Right Mouse Button to accelerate
if (Input.GetMouseButton(1))
{
speed = Mathf.Lerp(speed, accelerationSpeed, Time.deltaTime * 3);
}
else
{
speed = Mathf.Lerp(speed, normalSpeed, Time.deltaTime * 10);
}
//Set moveDirection to the vertical axis (up and down keys) * speed
Vector3 moveDirection = new Vector3(0, 0, speed);
//Transform the vector3 to local space
moveDirection = transform.TransformDirection(moveDirection);
//Set the velocity, so you can move
r.velocity = new Vector3(moveDirection.x, moveDirection.y, moveDirection.z);
//Camera follow
mainCamera.transform.position = Vector3.Lerp(mainCamera.transform.position, cameraPosition.position, Time.deltaTime * cameraSmooth);
mainCamera.transform.rotation = Quaternion.Lerp(mainCamera.transform.rotation, cameraPosition.rotation, Time.deltaTime * cameraSmooth);
//Rotation
float rotationZTmp = 0;
if (Input.GetKey(KeyCode.A))
{
rotationZTmp = 1;
}
else if (Input.GetKey(KeyCode.D))
{
rotationZTmp = -1;
}
mouseXSmooth = Mathf.Lerp(mouseXSmooth, Input.GetAxis("Mouse X") * rotationSpeed, Time.deltaTime * cameraSmooth);
mouseYSmooth = Mathf.Lerp(mouseYSmooth, Input.GetAxis("Mouse Y") * rotationSpeed, Time.deltaTime * cameraSmooth);
Quaternion localRotation = Quaternion.Euler(-mouseYSmooth, mouseXSmooth, rotationZTmp * rotationSpeed);
lookRotation = lookRotation * localRotation;
transform.rotation = lookRotation;
rotationZ -= mouseXSmooth;
rotationZ = Mathf.Clamp(rotationZ, -45, 45);
spaceshipRoot.transform.localEulerAngles = new Vector3(defaultShipRotation.x, defaultShipRotation.y, rotationZ);
rotationZ = Mathf.Lerp(rotationZ, defaultShipRotation.z, Time.deltaTime * cameraSmooth);
//Update crosshair texture
if (crosshairTexture)
{
crosshairTexture.position = mainCamera.WorldToScreenPoint(transform.position + transform.forward * 100);
}
}
}
- قم بإرفاق البرنامج النصي SC_SpaceshipController بالكائن "Spaceship"
- قم بإنشاء كائن GameObject جديد، وأطلق عليه اسم "CameraPosition" وحركه داخل الكائن "Spaceship"
- قم بتحريك الكاميرا الرئيسية داخل الكائن "CameraPosition" وقم بتغيير موضعه إلى (0، 0، 0)
- قم بتعديل موضع الكائن "CameraPosition" حتى تشعر بالرضا عن النتيجة
- قم بتحريك الكاميرا الرئيسية خارج الكائن "Spaceship"
- في SC_SpaceshipController، قم بتعيين متغيرات موضع الكاميرا والكاميرا الرئيسية وجذر سفينة الفضاء (يجب أن يكون هذا تحويلًا لنموذج سفينة الفضاء)
- قم بإنشاء لوحة واجهة مستخدم جديدة (GameObject -> UI -> Canvas)
- انقر بزر الماوس الأيمن على كائن Canvas -> واجهة المستخدم -> الصورة
- قم بتغيير محاذاة الصورة الجديدة إلى أعلى اليسار
- قم بتعيين الكائن أدناه للصورة
- أخيرًا، قم بتعيين الصورة التي تم إنشاؤها حديثًا إلى Crosshair Texture في SC_SpaceshipController
وحدة تحكم سفينة الفضاء جاهزة. استخدم الماوس للنظر حولك، وA/D للتدوير على طول المحور Z، وزر الماوس الأيمن للتسريع.