Показаны сообщения с ярлыком c#. Показать все сообщения
Показаны сообщения с ярлыком c#. Показать все сообщения

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

Прицел

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


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 г.

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();
}
}
}

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

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