четверг, 19 апреля 2012 г.

Свободная камера


#pragma strict
var lookSpeed = 15.0;
var moveSpeed = 15.0;

var rotationX = 0.0;
var rotationY = 0.0;

function Update ()
{
    rotationX += Input.GetAxis("Mouse X")*lookSpeed;
    rotationY += Input.GetAxis("Mouse Y")*lookSpeed;
    rotationY = Mathf.Clamp (rotationY, -90, 90);
    
    transform.localRotation = Quaternion.AngleAxis(rotationX, Vector3.up);
    transform.localRotation *= Quaternion.AngleAxis(rotationY, Vector3.left);
    
    transform.position += transform.forward*moveSpeed*Input.GetAxis("Vertical");
    transform.position += transform.right*moveSpeed*Input.GetAxis("Horizontal");
}

Прицел

Как получить объект в прицеле


Ray ray = camera.ScreenPointToRay(new Vector3(camera.GetScreenWidth()/2  ,camera.GetScreenHeight()/2, 0.0f));
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Vector3 meshPos = camera.WorldToScreenPoint (hit.transform.position);
GUI.DrawTexture(new Rect(meshPos.x-25 ,camera.GetScreenHeight()-meshPos.y-25 ,50,50), texture, ScaleMode.ScaleToFit, true);
}

Как показать объект через объект (Без шейдерно)

Для этого нужно 2-ве камеры

Первая будет показывать весь мир, вторая только объекты скрытые.

На объекте проверяем рейкаст в камеру.


// Update is called once per frame
void Update () {
Ray ray = new Ray(Camera.main.transform.position, this.transform.position - Camera.main.transform.position);
//Debug.DrawLine (ray.origin, ray.direction, Color.red);   
Debug.DrawRay(Camera.main.transform.position, this.transform.position - Camera.main.transform.position, Color.yellow);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (hit.transform!=this.transform && hit.transform!=this.transform.parent)
{
//Debug.Log("Hit Name:" + hit.transform.name);
this.transform.renderer.enabled = true;
}
else
{
this.transform.renderer.enabled = false;
}
}
else
{
this.transform.renderer.enabled = false;
}
}

 Как подписать объект

Как подписать объект в 3Д пространстве


public Texture2D texture;
public Transform target;
public Camera camera;

public void OnGUI()
{
Vector3 screenPos = camera.WorldToScreenPoint (target.position);
if (screenPos.z > 0)
{
GUI.DrawTexture(new Rect(screenPos.x-25 ,camera.GetScreenHeight()-screenPos.y-25 ,50,50), texture,ScaleMode.ScaleToFit,true);
GUIStyle s = new GUIStyle();
s.alignment = TextAnchor.UpperCenter;
GUI.Label(new Rect(screenPos.x-50 ,camera.GetScreenHeight()-screenPos.y-30, 100,25), "Sphere1",s );
}
}

четверг, 5 апреля 2012 г.

UDP


MSDN Magazine > Issues and Downloads > 2006 > February >  UDP Delivers: Take Total Control Of Your Networ...
UDP Delivers
Take Total Control Of Your Networking With .NET And UDP
Yaniv Pessach

This article discusses:
  • The pros and cons of TCP and UDP
  • Building UDP into your applications
  • Reliability protocols and security issues
  • UDP support in Windows Communication Foundation

Сервер SmartFox

http://www.smartfoxserver.com/

Недостатки: разработка под JAVA
Стоимость: 1500$+

Сервер Photone

http://www.exitgames.com/

Недостатки: Windows Only
Стоимость: 800$ инди. (<10000$/мес.)

Python UDP, Twisted


from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

class Echo(DatagramProtocol):

    def datagramReceived(self, data, (host, port)):
        print "received %r from %s:%d" % (data, host, port)
        self.transport.write(data, (host, port))

reactor.listenUDP(12000, Echo())
reactor.run()

C# UDP

Реализация UDP на C#


using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace LidTest
{



class MainClass
{

static UdpClient usck;

    static void recv(IAsyncResult res) {
            IPEndPoint remote = new IPEndPoint(IPAddress.Any,0);          
            byte[] data = usck.EndReceive(res, ref remote);

            // do something with data received from remote
            Console.WriteLine(remote.Address.ToString() + ": " + Encoding.ASCII.GetString(data));

            // get next packet
            usck.BeginReceive(recv, null);

    }


public static void Main (string[] args)
{

            usck = new UdpClient("localhost",12000);
            Console.WriteLine("waiting for packets, hit enter to stop");          
            usck.BeginReceive(new AsyncCallback(recv), null);
//usck.Send(new byte[] {1,2,3} , 3);

System.IO.MemoryStream ms = new System.IO.MemoryStream();

BinaryWriter bw = new BinaryWriter(ms);
bw.Write((Int16)(2));
bw.Write("ПИП");
bw.Write((Int16)(4));
bw.Write(true);
bw.Flush();
byte[] b =ms.ToArray();
usck.Send(b,b.Length);


            Console.ReadLine();
            usck.Close();
}
}
}

Мировые координаты в Экранные


var target : Transform;

function Update () {
    var screenPos : Vector3 = camera.WorldToScreenPoint (target.position);
    print ("target is " + screenPos.x + " pixels from the left");
}

Шейдеры

Шейдеры в Unity пишутся на специальном языке, который называется ShaderLab. Язык этот не сложный и в этой статье я его попытаюсь описать. Конечно большая часть этого урока – содержание справки Unity, но так как у многих проблемы с английским – этот урок будет полезным.

Кватернион


Что такое кватернион?

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

В Unity3D вращения задаются в кватернионах (Quaternion) не смотря на то, что есть доступ к Эйлеровым углам. Эйлеровы углы вычисляются из кватерниона при чтении и из Эйлеровых углов создается кватернион при присвоении.

Экранные координаты в мировые

Для того чтоб определить объект в пространстве находящийся под курсором необходимо:
1. Перевести экранные координаты указателя (мыши) в луч с использованием метода камеры camera.ScreenPointToRay()
2. Пустить луч с помощью физики с использованием метода Physics.Raycast()
3. Если луч попал в какой-то объект (объект должен иметь коллайдер, чтобы в него можно было попасть лучем).
4. Обработать результат.

среда, 4 апреля 2012 г.

Lerp Slerp

Interpolates , Spherically interpolates between two vectors.


  1. var damping = 3.0;
  2. function Update ()
  3. {
  4.     transform.position = Vector3.Lerp(transform.position, target.position, Time.deltaTime * damping);   
  5.     transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, Time.deltaTime * damping);   
  6. }

Вращение камеры вокруг объекта


var target : Transform; //What to rotate around
var distance = 5.0; //How far away to orbit
var xSpeed = 125.0; //X sensitivity
var ySpeed = 50.0; //Y sensitivity

private var x = 0.0; //Angle of the y rotation?
private var y = 0.0; //Angle of the x rotation?

@script AddComponentMenu("Scripts/Mouse Orbit") //Add to menu

function Start() {Run this once at the start
    //Initialize the angles
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;
}

function LateUpdate() { //Every frame, do this as late as you can
    if (target) {//There's a target
        //Change the angles by the mouse movement
        x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
        y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;

        //Rotate the camera to those angles 
        var rotation = Quaternion.Euler(y, x, 0);
        transform.rotation = rotation;

        //Move the camera to look at the target
        var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
        transform.position = position;
    }
}

Скриптовые события

При разработке на Unity3d часто необходимо привязать выполнение своих функций к конкретному событию. В Unity3d таких событий довольно большое количество, в данном разделе я постараюсь описать самые используемые из них.

Данная функция вызывается каждый раз перед отображением очередного кадра. Самая используемая для расчетов игровых параметров. Но категорически не рекомендуется использовать в ней расчет физических показателей.
Update()

Трассировка лучей

Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.

Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:
var hit : RaycastHit;

Физические свойства игрового объекта

Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.

Получаем/задаем вектор скорости объекта:
var velocity = GameObject.rigidbody.velocity;
GameObject.rigidbody.velocity = Vector3(0, 1, 0);

Немного про координаты


Свойство transform объекта GameObject содержит в себе данные о положении объекта в игровом мире.


Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:

var position = GameObject.transform.position; 
var x = position.x;