首页 > 代码库 > unity3d 制作打飞机小游戏

unity3d 制作打飞机小游戏

  

 

作为刚入门小游戏,在制作过程中遇到一些问题,挑重点记录下。

第一:摇杆的制作

使用了官方的joystick类,但是官方没有提供c#版的joystick,这就导致了我不会将js脚本和c#脚本进行通信。最后解决办法是找到网络大牛翻译回来的joystick  c#版本,顺利实现摇杆。附上c#版joystick

using UnityEngine;/** * File: MPJoystick.cs * Author: Chris Danielson of (monkeyprism.com) * // USED TO BE: Joystick.js taken from Penelope iPhone Tutorial//// Joystick creates a movable joystick (via GUITexture) that // handles touch input, taps, and phases. Dead zones can control// where the joystick input gets picked up and can be normalized.//// Optionally, you can enable the touchPad property from the editor// to treat this Joystick as a TouchPad. A TouchPad allows the finger// to touch down at any point and it tracks the movement relatively // without moving the graphic*/[RequireComponent(typeof(GUITexture))]public class MPJoystick : MonoBehaviour{    class Boundary    {        public Vector2 min = Vector2.zero;        public Vector2 max = Vector2.zero;    }    private static MPJoystick[] joysticks;	 // A static collection of all joysticks    private static bool enumeratedJoysticks = false;    private static float tapTimeDelta = 0.3f;	 // Time allowed between taps    public bool touchPad;    public Vector2 position = Vector2.zero;    public Rect touchZone;    public Vector2 deadZone = Vector2.zero;	 // Control when position is output    public bool normalize = false; // Normalize output after the dead-zone?    public int tapCount;    private int lastFingerId = -1;	 // Finger last used for this joystick    private float tapTimeWindow;	 // How much time there is left for a tap to occur    private Vector2 fingerDownPos;    //private float fingerDownTime;    //private float firstDeltaTime = 0.5f;    private GUITexture gui;    private Rect defaultRect;	 // Default position / extents of the joystick graphic    private Boundary guiBoundary = new Boundary();	 // Boundary for joystick graphic    private Vector2 guiTouchOffset;	 // Offset to apply to touch input    private Vector2 guiCenter;	 // Center of joystick    void Start()    {        gui = (GUITexture)GetComponent(typeof(GUITexture));        defaultRect = gui.pixelInset;        defaultRect.x += transform.position.x * Screen.width;// + gui.pixelInset.x; // -  Screen.width * 0.5;        defaultRect.y += transform.position.y * Screen.height;// - Screen.height * 0.5;        transform.position = Vector3.zero;        if (touchPad)        {            // If a texture has been assigned, then use the rect ferom the gui as our touchZone            if (gui.texture)                touchZone = defaultRect;        }        else        {            guiTouchOffset.x = defaultRect.width * 0.5f;            guiTouchOffset.y = defaultRect.height * 0.5f;            // Cache the center of the GUI, since it doesn‘t change            guiCenter.x = defaultRect.x + guiTouchOffset.x;            guiCenter.y = defaultRect.y + guiTouchOffset.y;            // Let‘s build the GUI boundary, so we can clamp joystick movement            guiBoundary.min.x = defaultRect.x - guiTouchOffset.x;            guiBoundary.max.x = defaultRect.x + guiTouchOffset.x;            guiBoundary.min.y = defaultRect.y - guiTouchOffset.y;            guiBoundary.max.y = defaultRect.y + guiTouchOffset.y;        }    }    public Vector2 getGUICenter()    {        return guiCenter;    }    void Disable()    {        gameObject.active = false;        //enumeratedJoysticks = false;    }    private void ResetJoystick()    {        gui.pixelInset = defaultRect;        lastFingerId = -1;        position = Vector2.zero;        fingerDownPos = Vector2.zero;    }    private bool IsFingerDown()    {        return (lastFingerId != -1);    }    public void LatchedFinger(int fingerId)    {        // If another joystick has latched this finger, then we must release it        if (lastFingerId == fingerId)            ResetJoystick();    }    void Update()    {        if (!enumeratedJoysticks)        {            // Collect all joysticks in the game, so we can relay finger latching messages            joysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick));            enumeratedJoysticks = true;        }        int count = Input.touchCount;        if (tapTimeWindow > 0)            tapTimeWindow -= Time.deltaTime;        else            tapCount = 0;        if (count == 0)            ResetJoystick();        else        {            for (int i = 0; i < count; i++)            {                Touch touch = Input.GetTouch(i);                Vector2 guiTouchPos = touch.position - guiTouchOffset;                bool shouldLatchFinger = false;                if (touchPad)                {                    if (touchZone.Contains(touch.position))                        shouldLatchFinger = true;                }                else if (gui.HitTest(touch.position))                {                    shouldLatchFinger = true;                }                // Latch the finger if this is a new touch                if (shouldLatchFinger && (lastFingerId == -1 || lastFingerId != touch.fingerId))                {                    if (touchPad)                    {                        //gui.color.a = 0.15;                        lastFingerId = touch.fingerId;                        //fingerDownPos = touch.position;                        //fingerDownTime = Time.time;                    }                    lastFingerId = touch.fingerId;                    // Accumulate taps if it is within the time window                    if (tapTimeWindow > 0)                        tapCount++;                    else                    {                        tapCount = 1;                        tapTimeWindow = tapTimeDelta;                    }                    // Tell other joysticks we‘ve latched this finger                    //for (  j : Joystick in joysticks )                    foreach (MPJoystick j in joysticks)                    {                        if (j != this)                            j.LatchedFinger(touch.fingerId);                    }                }                if (lastFingerId == touch.fingerId)                {                    // Override the tap count with what the iPhone SDK reports if it is greater                    // This is a workaround, since the iPhone SDK does not currently track taps                    // for multiple touches                    if (touch.tapCount > tapCount)                        tapCount = touch.tapCount;                    if (touchPad)                    {                        // For a touchpad, let‘s just set the position directly based on distance from initial touchdown                        position.x = Mathf.Clamp((touch.position.x - fingerDownPos.x) / (touchZone.width / 2), -1, 1);                        position.y = Mathf.Clamp((touch.position.y - fingerDownPos.y) / (touchZone.height / 2), -1, 1);                    }                    else                    {                        // Change the location of the joystick graphic to match where the touch is                        Rect r = gui.pixelInset;                        r.x = Mathf.Clamp(guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x);                        r.y = Mathf.Clamp(guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y);                        gui.pixelInset = r;                    }                    if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)                        ResetJoystick();                }            }        }        if (!touchPad)        {            // Get a value between -1 and 1 based on the joystick graphic location            position.x = (gui.pixelInset.x + guiTouchOffset.x - guiCenter.x) / guiTouchOffset.x;            position.y = (gui.pixelInset.y + guiTouchOffset.y - guiCenter.y) / guiTouchOffset.y;        }        // Adjust for dead zone        var absoluteX = Mathf.Abs(position.x);        var absoluteY = Mathf.Abs(position.y);        if (absoluteX < deadZone.x)        {            // Report the joystick as being at the center if it is within the dead zone            position.x = 0;        }        else if (normalize)        {            // Rescale the output after taking the dead zone into account            position.x = Mathf.Sign(position.x) * (absoluteX - deadZone.x) / (1 - deadZone.x);        }        if (absoluteY < deadZone.y)        {            // Report the joystick as being at the center if it is within the dead zone            position.y = 0;        }        else if (normalize)        {            // Rescale the output after taking the dead zone into account            position.y = Mathf.Sign(position.y) * (absoluteY - deadZone.y) / (1 - deadZone.y);        }    }}

  第二,屏幕边界处理,还没有学会ngui,只能用最笨拙的方法处理超屏问题。

//屏幕限制范围                Vector2 screenpos = Camera.main.WorldToScreenPoint(m_transform.position);        float x = screenpos.x;        float y = screenpos.y;        float cross_x = Screen.width;        float cross_y = Screen.height;        float xx=-1.0f;        float yy=5.0f;        float cross_xx=5.0f;        float cross_yy=15.0f;        if (x < 0)        {            m_transform.position = new Vector3(xx, m_transform.position.y, m_transform.position.z);        }        else if (x > cross_x)            m_transform.position = new Vector3(cross_xx, m_transform.position.y, m_transform.position.z);        if (y < 0)            m_transform.position = new Vector3(m_transform.position.x, m_transform.position.y, yy);        else if (y > cross_y)            m_transform.position = new Vector3(m_transform.position.x, m_transform.position.y, cross_yy);