Получаем системное время

Вот такой скрипт позволит получать текущее время:

import System;
var date = DateTime.Now;
var date_hour = date.Hour;//Час
var date_min = date.Minute;//Минута
var date_sec = date.Second;//Секунда

var date_year = date.Year;//Год
var date_month = date.Month;//Месяц
var date_day = date.Day;//День

var date_hour_zero = "";//Для добавления нулей
var date_min_zero = "";
var date_sec_zero = "";

function Update () {
UpdateTime();
}

function OnGUI () {
GUI.Label (Rect (0, 0, 300, 100),
"Time:"+date_hour_zero+date_hour+":"+date_min_zero+date_min+
":"+date_sec_zero+date_sec);
GUI.Label (Rect (0, 25, 300, 100),
"Year: "+date_year+" Month: "+date_month+" Day: "+date_day);

if (date_min == 20)//Пробная проверка
{
GUI.Label (Rect (25, 300, 300, 100), "20 minutes");
}
}

function ZeroCorrection() {
//Функция добавляет нули в отображении часа/секунды/минуты, так красивше
if (date_hour < 10)
{
date_hour_zero = "0";
}
else
{
date_hour_zero = "";
}

if (date_min <10)
{
date_min_zero = "0";
}
else
{
date_min_zero = "";
}

if (date_sec <10)
{
date_sec_zero = "0";
}
else
{
date_sec_zero = "";
}

}

function UpdateTime() {
//Обновляем все переменные
date_hour = DateTime.Now.Hour;
date_min = DateTime.Now.Minute;
date_sec = DateTime.Now.Second;
date_year = date.Year;
date_month = date.Month;
date_day = date.Day;

ZeroCorrection();
}
Реклама

RUN

За два коротких вечера сделал прототип, который показался мне весьма забавным. Цель в этой игре — бегать по бесконечному лабиринту.

Лабиринт извивается, и игроку следует с помощью мыши вписываться в повороты, чтобы не скорость не снижалась при столкновении со стеной.

Играть здесь

Исходники прилагаются — здесь

Зум ортогональной камеры

Этот скрипт я нашел на русскоязычном форуме Unity3d.ru

Назначив скрипт на камеру, во время игры можно будет изменять размер проекции  ортогональной камеры с помощью колесика мыши. Очень полезный скрипт для двухмерных игр.

zoom_min и zoom_max — переменные, задающие максимальное и минимальное значения размера проекции.

var zoom_min = 90;
var zoom_max = 240;
function Update () {
camera.orthographicSize =camera.orthographicSize -(
Input.GetAxis("Mouse ScrollWheel")*30);

if (camera.orthographicSize <= zoom_min)
{
camera.orthographicSize = zoom_min;
}

if (camera.orthographicSize >= zoom_max)
{
camera.orthographicSize = zoom_max;
}

}

Звуки шагов

Это выдержка из скрипта FPSPlayer туториала FPS Tutorial.

Позволяет сделать рандомный выбор из случайных звуков шагов. Ставится на Game Object с CharacterController`ом.

var walkSounds : AudioClip[];
var audioStepLength = 0.3;

function Awake () {
PlayStepSounds ();
}

function PlayStepSounds () {
    var controller : CharacterController = GetComponent(CharacterController);

    while (true) {
        if (controller.isGrounded && controller.velocity.magnitude > 0.3) {
            audio.clip = walkSounds[Random.Range(0, walkSounds.length)];
            audio.Play();
            yield WaitForSeconds(audioStepLength);
        } else {
            yield;
        }
    }
}
var walkSounds : AudioClip[];
var audioStepLength = 0.3;

function Awake () {

PlayStepSounds ();

}

function PlayStepSounds () {
var controller : CharacterController = GetComponent(CharacterController);

while (true) {
if (controller.isGrounded && controller.velocity.magnitude > 0.3) {
audio.clip = walkSounds[Random.Range(0, walkSounds.length)];
audio.Play();
yield WaitForSeconds(audioStepLength);
} else {
yield;
}
}
}

FPSController

С помощью этого префаба юнити можно очень просто создать «болванку» для персонажа игрока в трехмерной игре.

Префаб First Person Controller

Префаб First Person Controller находится в папке Standart Assets\Prefabs

Этот компонент содержит:

Character Controller — компонент,  используемый в играх от третьего и первого лица. На этот компонент не действуют команды rigidbody-физики.

  • Height — высота капсульного коллайдера.
  • Radius — можно сказать, что это ширина коллайдера.
  • Slope Limit — здесь указывается наклон, на который сможет передвигаться коллайдер.
  • Step Offset — коллайдер сможет подняться на следующую ступень, только если она ближе к земле чем значение этой переменной.
  • Min Move Distance — если персонаж передвинулся на меньшее значение, чем в этой переменной, он не сдвинется с места. Чаще всего используется, чтобы уменьшить дрожание.
  • Skin width — два коллайдера могут проходить сквозь друг друга настолько, насколько равна эта переменная. Большое значение уменьшает дрожание, маленькое может привести к тому, что коллайдер будет застревать.
  • Center — центровка капсульного коллайдера.

MouseLook — скрипт, с помощью которого направление камеры зависит от движения курсора мыши.

FPSWalker — скрипт, который отвечает за передвижение персонажа.

  • Speed — скорость передвижения персонажа.
  • JumpSpeed — высота прыжка персонажа.
  • Gravity — гравитация, которая действует только на персонаж во время прыжка.

Для удобного доступа к переменным скрипта FPSWalker, я создаю управляющий скрипт (scr_player_status)

var fps_walker;
var st_moving;
function Start () {
fps_walker = GetComponent(FPSWalker);
}

Этот скрипт ставится на главный объект префаба First Person Controller

Теперь с помощью переменной fps_walker мы можем получить доступ к скорости, мощности прыжка и гравитации. st_moving — переменная-флаг.

Чтобы продемонстрировать работу со скоростью, реализуем «уставание» — во время бега переменная, отвечающая за энергию, уменьшается. Низкая энергия приводит к низкой скорости.

Вверху скрипта выразим две переменные

var st_energy = 100.0;
var st_energy_max = 100.0;

Первая — это текущая энергия. Вторая — максимальный уровень энергии.

Теперь сделаем так, чтобы во время передвижения, персонаж терял очки энергии. Мы не будем изменять FPSWalker, и реализуем это все в scr_player_status.

function Update () {
if (Input.GetKey ("w" ) && fps_walker.grounded == true)
{
st_moving = 1;
st_energy = st_energy - 0.15;
}
else
{st_moving = 0;}
if (Input.GetKey ("s") && fps_walker.grounded == true)
{
st_moving = 1;
st_energy = st_energy - 0.05;
}
else
{st_moving = 0;}
}

fps_walker.grounded == true — это проверка на то, находится ли персонаж в воздухе. Мы же не хотим, чтобы персонаж терял энергию в прыжке?

Нам нужно показывать количество очков энергии, поэтому добавим в наш скрипт функцию OnGUI()

function OnGUI () {
GUI.Label (Rect (25, 90, 200, 200), "Energy "+st_energy);
}

Теперь добавим в наш скрипт зависимость скорости от энергии:

if (st_energy < 40)
{fps_walker.speed = 2;}
if (st_energy > 40)
{fps_walker.speed = 8;}

Теперь сделаем так, чтобы уровень энергии не мог принимать значения больше 100 и меньше 1

if (st_energy > st_energy_max)
{
st_energy = st_energy_max;
}
if (st_energy < 1.0)
{
st_energy = 1;
}

Теперь сделаем восстановление энергии в то время, когда персонаж стоит на месте

if (st_moving == 0)
{st_energy = st_energy+0.30;}

Вот весь скрипт (ставьте его на главный объект префаба First Person Controller)

var st_energy = 100.0;
var st_energy_max = 100.0;
var st_moving;
var fps_walker;
function Start () {
fps_walker = GetComponent(FPSWalker);
fps_walker.speed = 8;
}
function Update () {
/////
if (st_energy > st_energy_max)
{
st_energy = st_energy_max;
}
if (st_energy < 1.0)
{
st_energy = 1;
}
if (st_moving == 0)
{st_energy = st_energy+0.030;}
/////
if (st_energy < 40)
{fps_walker.speed = 1;}
if (st_energy > 40)
{fps_walker.speed = 8;}
/////
if (Input.GetKey ("w") && fps_walker.grounded == true)
{
st_moving = 1;
st_energy = st_energy - 0.15;
}
else
{st_moving = 0;}
if (Input.GetKey ("s") && fps_walker.grounded == true)
{
st_moving = 1;
st_energy = st_energy - 0.05;
}
else
{st_moving = 0;}
}
function OnGUI () {
GUI.Label (Rect (25, 90, 200, 200), "Energy  "+st_energy);
}
GUI.Label (Rect (25, 90, 200, 200), «Gathered memory «+scores);

FPSwalker.js — передвижение во время прыжка

http://forum.unity3d.com/viewtopic.php?p=343503#343503

Этот измененный стандартный FPSWalker.js позволит игроку управлять передвижением даже в воздухе.

var speed = 6.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
private var lastYSpeed : float = 0;
function FixedUpdate() {
if (grounded)
{
// We are grounded, so recalculate movedirection directly from axes
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
// On the ground
lastYSpeed = 0;
}
else
{
// We are in the air, maintain lastYSpeed
moveDirection = new Vector3(Input.GetAxis("Horizontal"), lastYSpeed, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
// Remove speed factor from influencing Y value
moveDirection.x *= speed;
moveDirection.z *= speed;
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;
lastYSpeed = moveDirection.y;
// Move the controller
var controller : CharacterController = GetComponent(CharacterController);
var flags = controller.Move(moveDirection * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}
@script RequireComponent(CharacterController)