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

  

原文地址:https://www.cnblogs.com/zhanying/p/3919037.html