Palvelutehtävissä toimiminen kurssin palautus

Valitsin jälkimmäisen tehtävän, mikä oli 3d peli alueen luominen ja 1st tai 3rd person controllerin tekeminen. Engineksi valitsin Unityn versio 4.6.

Tein aluksi camera controlli scriptin ja pelaajan liikkumis scriptin. (Source alla)

Kamera koodissa on kaksi moodia. Siinä joko kameran rotaatio vaihtaa pelaajan rotaatiota tai se ei vaikuta ollenkaan.
Kameraa voi zoomata sisään hiiren rullaa käyttäen. Kamera seuraa pelaajan y akselin liikettä hieman jäljessä, jolloin syntyy hieno smooth effekti, kun hyppää. Kamera ei myöskään mene seinien tai terrainin sisään, vaan siirtää omaa paikkaansa sen mukaan.

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

	private Transform m_transform;
	public Transform playerTransform;

	private float m_x;
	private float m_y;

	public float xSpeed;
	public float ySpeed;

	private Vector3 m_angles;

	public float distanceMin, distanceMax;

	public float distance = 0;

	private Vector3 velocity;

	public float followSpeed;

	private void Awake()
	{
		m_transform = transform;

		m_angles = m_transform.eulerAngles;
		m_x = m_angles.y;
		m_y = m_angles.x;
	}

	public enum Mode
	{
		rotatePlayer,
		ignorePlayer
	};

	[SerializeField]
	private Mode cameraMode;

	private void FixedUpdate ()
	{

		m_x += Input.GetAxis("Mouse X") * xSpeed;
		m_y -= Input.GetAxis("Mouse Y") * ySpeed;

		Quaternion rotation = Quaternion.Euler(m_y, m_x, 0);

		m_transform.rotation = rotation;

		distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);
		Vector3 desiredPos = rotation * new Vector3 (0, 0, -distance) + playerTransform.position;
                // Smooth y axis to slowly follow player.
		float smoothY = Mathf.SmoothDamp(m_transform.position.y, desiredPos.y,ref velocity.y, followSpeed);
		m_transform.position = new Vector3(desiredPos.x,smoothY,desiredPos.z);

		if(playerTransform != null && cameraMode == Mode.rotatePlayer)
			playerTransform.localEulerAngles = new Vector3(playerTransform.localEulerAngles.x, m_transform.localEulerAngles.y, playerTransform.localEulerAngles.z);

		RaycastHit hit;
		if(Physics.Raycast(playerTransform.position,(m_transform.position - playerTransform.position).normalized,out hit,(distance <= 0 ? -distance : distance)))
		{
			m_transform.position = hit.point - (m_transform.position - hit.point).normalized * 1.2f;
		}

	}
}

Player movement script

Liikkumis scriptissä on kaksi moodia, keyboard turn, joka on tarkoitettu käytettäväksi kameran ignore moodin kanssa ja normaali moodi, mikä on tarkoitettu käytettäväksi silloin, kun kameran rotaatio vaikuttaa myös pelaajan rotaatioon.

using UnityEngine;
using System.Collections;

public class Movement : MonoBehaviour {

	public bool AllowMovement;
	public float speed;

	private Rigidbody m_rigidbody;
	private Vector3 m_moveDirection = Vector3.zero;
	private Transform m_transform;
	private bool m_isGrounded;
	private float m_yVelocity;

	[SerializeField]
	private float m_fallingSpeed;

	[SerializeField]
	private float m_jumpSpeed;

	[SerializeField]
	private LayerMask m_layerMask;

	public bool keyboardTurnMode;
	public float turnSpeed;

	void Awake()
	{
		m_transform = transform;
		m_rigidbody = rigidbody;
	}

	void FixedUpdate()
	{
		if(AllowMovement)
			DoMovement();
	}
	/// <summary>
	/// Do player movement
	/// </summary>
	void DoMovement()
	{
		m_rigidbody.velocity = Vector3.zero;
		m_rigidbody.velocity = Vector3.zero;
		Vector3 dist = m_moveDirection;

		if(keyboardTurnMode)
		{
			m_transform.Rotate(0,Input.GetAxis("keyboardTurn") * turnSpeed,0);

		}
		RaycastHit ray;
		if(Physics.SphereCast(m_transform.position, .5f,Vector3.down,out ray,.5f,m_layerMask))
			m_isGrounded = true;
		else
			m_isGrounded = false;

		if(Input.GetKeyDown(KeyCode.Space) && m_isGrounded)
		{
			m_yVelocity = m_jumpSpeed;
		}
		if (m_isGrounded && m_yVelocity < 0)
		{
			m_yVelocity = -0.1f;
		}
		else
		{
			m_yVelocity += Physics.gravity.y * m_fallingSpeed * Time.deltaTime;
		}

		dist.y = m_yVelocity * Time.deltaTime;

		m_moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
		m_moveDirection = m_transform.TransformDirection(m_moveDirection);
		m_moveDirection *= speed;

		m_rigidbody.velocity = dist;
	}
}

Scriptin pätkien jälkeen, Importtasin Unityn default terrain assetit. Niissä tulee mukana muutama tekstuuri, default puita ja muutama erilainen ruoho.

Tein custom materiaalin, joka mahdollistaa normal mappien käytön terrainissa.

terrainmat

Tein normal mapit terrainin default tekstuureista, ja painttasin terrainin.

scene3

Lisäsin valaistuksen ja laitoin sen käyttämään realtime varjoja ja lisäsin muutaman puun.

scene2

Lopuksi lisäsin peliin muilta oppilailta saatuja 3d malleja. Lisäsin pelaajaksi, jonkun tekemän kaktuksen.

scene

Laitoin kaktukselle erään toisen oppilaan tekemän haulikon päähän. Lisäsin peliin aikaisemmin tekemäni ampumis scriptin ja tein ammukset käytteän trail rendereriä.

jaa

Lataa projekti täältä: Project files