Unity3D-移动控制

一、AI直线跟随移动(最直接的AI移动)

        玩家移动过程中,AI自动跟随玩家进行移动。(此跟随系统AI只能直线移动)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public int Speed = 1;
    public Transform w;//目标位置
    private Vector3 qt; //自身初始位置
    void Start()
    {

        qt = this.transform.position;
    }



    // Use this for initialization
    void Update()
    {
        if (transform.tag == "zs")
        {
            this.transform.position = Vector3.MoveTowards(this.transform.position, qt, Speed*Time.deltaTime);// Camera.main.transform.forward * OverSpeed * Time.deltaTime;
            this.transform.rotation = Quaternion.Euler(0, 0, 0);
    
        }
        else if (transform.tag == "zq")
        {
            this.transform.position = Vector3.MoveTowards(this.transform.position, w.position,Speed*Time.deltaTime);// - Camera.main.transform.forward * OverSpeed;// * Time.deltaTime;
            
        }
    }
    
}

二、玩家移动控制(一般用于VR游戏)

        玩家可通过方向键“W""S""A""D"进行前进后退,同时也可以通过摄像机的前后左右的倾斜来进行移动。移动速度可通过倾斜角度调节。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerControl : MonoBehaviour
{
    public int playerSpeed = 1;
    public int rSpeed = 50;
    public int headLeanAngle=45;
    public int headTilt=30;    

    public float DOUBLE_CLICK_TIME = 0.2f;
    private float lastClickTime;  
       
    void Update()
    {       
        //KeyBoard Input:=============================
        if (Input.GetKey("up"))
        {
             transform.position = transform.position + Camera.main.transform.forward * playerSpeed * Time.deltaTime;
        }
    
        if (Input.GetKey("down"))
        {
             transform.position = transform.position - Camera.main.transform.forward * playerSpeed * Time.deltaTime;
        }
    
        if (Input.GetKey("left"))
        {
            //transform.Rotate(new Vector3(0, -1, 0) * Time.deltaTime * playerSpeed*rSpeed, Space.World);
             transform.position = transform.position - Camera.main.transform.right * playerSpeed * Time.deltaTime;
        }
    
        if (Input.GetKey("right"))
        {
            //transform.Rotate(new Vector3(0, 1, 0) * Time.deltaTime * playerSpeed*rSpeed, Space.World);
             transform.position = transform.position + Camera.main.transform.right * playerSpeed * Time.deltaTime;
        }
    
        //keyboard double click:
        //Head Gesture input:================================
    
        Debug.Log(Camera.main.transform.eulerAngles);
    
        if (Camera.main.transform.eulerAngles.z>headTilt && Camera.main.transform.eulerAngles.z<90)
        {
              transform.Rotate(new Vector3(0, -1, 0) * Time.deltaTime * playerSpeed*rSpeed, Space.World);
        }
    
        if (Camera.main.transform.eulerAngles.z>270 && Camera.main.transform.eulerAngles.z<360-headTilt)
        {
              transform.Rotate(new Vector3(0, 1, 0) * Time.deltaTime * playerSpeed*rSpeed, Space.World);
        }
    
        if (Camera.main.transform.eulerAngles.x>headLeanAngle && Camera.main.transform.eulerAngles.x<90)
        {
             transform.position = transform.position + Camera.main.transform.forward * playerSpeed * Time.deltaTime;
        }
    
    }

}

三、手机陀螺仪控制移动( 面向于手机端的移动控制。)

   

using System.Collections.Generic;
using UnityEngine;

public class SDKGyroController : MonoBehaviour
{
    //陀螺仪是否存在

    class GyroGameObject
    {
        public GameObject go = null;
        public bool m_IsRotate = false;
        public bool m_IsBack = false;
        public Vector3 m_StartVec3 = Vector3.zero;
        public float m_RangeX = 0;
        public float m_RangeY = 0;
        public float m_SpeedX = 0;
        public float m_SpeedY = 0;
        public float m_LerpParam = 0;
        public float lastDiff_X;
        public float lastDiff_Y;
        public void Clear()
        {
            go = null;
        }
        public void ReSet()
        {
            if (go != null)
            {
                go.transform.localPosition = m_StartVec3;
            }
        }
    }
    private List<GyroGameObject> gyroGameObjects = new List<GyroGameObject>();
    
    private bool gyroBool;
    public bool isGyro = true;
    //陀螺仪
    private Gyroscope gyro = null;
    
    private float m_StartGyroX;
    private float m_StartGyroY;
    
    //陀螺仪x轴的取值
    private float m_CurGyroX = 0f;
    private float m_CurGyroY = 0f;
    
    private float diff_X = 0f;
    private float diff_Y = 0f;
    
    private float valueGyroX = 0f;
    private float valueGyroY = 0f;
    // 调用,用来添加一个控制器脚本
    public static void AddGyroComponent(GameObject gameObject, float rangeX, float rangeY, float speedX, float speedY, float lerpValue)
    {
        SDKGyroController gm = gameObject.GetComponent<SDKGyroController>();
        if (gm == null)
            gm = gameObject.AddComponent<SDKGyroController>();
        gm.AddGyroGameObject(gameObject, rangeX, rangeY, speedX, speedY, lerpValue);
    }
    //调用,用来添加一个GameObject做移动旋转效果
    //默认为移动 isRotate true 为旋转
    //isBack 旋转方向和陀螺仪方向是否相反
    public void AddGyroGameObject(GameObject gameObject, float rangeX, float rangeY, float speedX, float speedY, float lerpValue, bool isRotate = false, bool isBack = false)
    {
        GyroGameObject gyro = new GyroGameObject();
        gyro.go = gameObject;
        gyro.m_IsRotate = isRotate;
        gyro.m_IsBack = isBack;
        if (isRotate)
            gyro.m_StartVec3 = new Vector3(gameObject.transform.localEulerAngles.x, gameObject.transform.localEulerAngles.y, gameObject.transform.localEulerAngles.z);
        else
        {
            gyro.m_StartVec3 = new Vector3(gameObject.transform.localPosition.x, gameObject.transform.localPosition.y, gameObject.transform.localPosition.z);
        }
        gyro.m_RangeX = rangeX;
        gyro.m_RangeY = rangeY;
        gyro.m_SpeedX = speedX;
        gyro.m_SpeedY = speedY;
        gyro.m_LerpParam = lerpValue;
        gyroGameObjects.Add(gyro);
    }
    public void Clear()
    {
        for (int i = 0; i < gyroGameObjects.Count; i++)
        {
            if (gyroGameObjects[i] != null)
            {
                gyroGameObjects[i].Clear();
            }
        }
        gyroGameObjects.Clear();
    }
    public void Clear(GameObject go)
    {
        for (int i = 0; i < gyroGameObjects.Count; i++)
        {
            if (gyroGameObjects[i].go == go)
            {
                gyroGameObjects.Remove(gyroGameObjects[i]);
                break;
            }
        }
    }
    void OnDestroy()
    {
        Clear();
    }
    void Awake()
    {

#if !UNITY_EDITOR
        //判断是否支持陀螺仪
        gyroBool = SystemInfo.supportsGyroscope;
#else
        gyroBool = true;
#endif


#if !UNITY_EDITOR
        //给陀螺仪赋值
        gyro = Input.gyro;
        if (gyro != null)
        {
            gyroBool = true;
            gyro.enabled = true;
        }
#endif
    }

    private void Start()
    {
        if (gyroBool)
        {

#if !UNITY_EDITOR
            m_StartGyroX = gyro.gravity.x;
            m_StartGyroY = gyro.gravity.y;
#else
            valueGyroX = 0;
            valueGyroY = 0;
            m_StartGyroX = valueGyroX;
            m_StartGyroY = valueGyroY;
#endif
        }
    }
    public void ReSet()
    {
        for (int i = 0; i < gyroGameObjects.Count; i++)
        {
            if (gyroGameObjects[i] != null) gyroGameObjects[i].ReSet();
        }
    }
    int m_upate_rate = 30;
    void Update()
    {
        Input.gyro.updateInterval = 1.0f / m_upate_rate;
        //位置随着陀螺仪重力感应的X轴变化而变化
        if (gyroBool && isGyro)
        {
            for (int i = 0; i < gyroGameObjects.Count; i++)
            {
                if (gyroGameObjects[i].m_IsRotate)
                {
                    RotateGameObject(gyroGameObjects[i]);
                }
                else
                {
                    TransformGameObject(gyroGameObjects[i]);
                }
            }
        }
    }

    private float curPosX = 0f;
    private float curPosY = 0f;
    //移动操作
    void TransformGameObject(GyroGameObject gyroGameObject)
    {
        if (gyroGameObject == null || gyroGameObject.go == null)
            return;

#if UNITY_EDITOR
        m_CurGyroX = valueGyroX;
        m_CurGyroY = valueGyroY;
#else
        m_CurGyroX = gyro.gravity.x;
        m_CurGyroY = gyro.gravity.y;
#endif
        if (gyroGameObject.m_IsBack)
        {
            m_CurGyroX = 0 - m_CurGyroX;
            m_CurGyroY = 0 - m_CurGyroY;
        }
        diff_X = m_CurGyroX - m_StartGyroX;
        diff_Y = m_CurGyroY - m_StartGyroY;

        float xx = Mathf.Lerp(0, diff_X, gyroGameObject.m_LerpParam);
        float yy = Mathf.Lerp(0, diff_Y, gyroGameObject.m_LerpParam);
    
        Vector3 v3 = new Vector3(xx * gyroGameObject.m_SpeedX, yy * gyroGameObject.m_SpeedY, 0);
    
        Vector3 curVec3 = gyroGameObject.go.transform.localPosition;
    
        if (v3.x > gyroGameObject.m_RangeX)
        {
            curPosX = gyroGameObject.m_StartVec3.x + gyroGameObject.m_RangeX;
            if (gyroGameObject.lastDiff_X > diff_X)
            {
                m_StartGyroX = m_CurGyroX - gyroGameObject.m_RangeX / gyroGameObject.m_SpeedX;
            }
        }
        else if (v3.x < -gyroGameObject.m_RangeX)
        {
            curPosX = gyroGameObject.m_StartVec3.x - gyroGameObject.m_RangeX;
            if (gyroGameObject.lastDiff_X < diff_X)
            {
                m_StartGyroX = m_CurGyroX + gyroGameObject.m_RangeX / gyroGameObject.m_SpeedX;
            }
        }
        else
        {
            float fx = Mathf.Lerp(curVec3.x, gyroGameObject.m_StartVec3.x + v3.x, gyroGameObject.m_LerpParam);
            curPosX = fx;
        }
    
        if (v3.y > gyroGameObject.m_RangeY)
        {
            curPosY = gyroGameObject.m_StartVec3.y + gyroGameObject.m_RangeY;
            if (gyroGameObject.lastDiff_Y > diff_Y)
            {
                m_StartGyroY = m_CurGyroY - gyroGameObject.m_RangeY / gyroGameObject.m_SpeedY;
            }
        }
        else if (v3.y < -gyroGameObject.m_RangeY)
        {
            curPosY = gyroGameObject.m_StartVec3.y - gyroGameObject.m_RangeY;
            if (gyroGameObject.lastDiff_Y < diff_Y)
            {
                m_StartGyroY = m_CurGyroY + gyroGameObject.m_RangeY / gyroGameObject.m_SpeedY;
            }
        }
        else
        {
            float fy = Mathf.Lerp(curVec3.y, gyroGameObject.m_StartVec3.y + v3.y, gyroGameObject.m_LerpParam);
            curPosY = fy;
        }
    
        gyroGameObject.go.transform.localPosition = new Vector3(curPosX, curPosY, gyroGameObject.m_StartVec3.z);
    
        gyroGameObject.lastDiff_X = diff_X;
        gyroGameObject.lastDiff_Y = diff_Y;
    
        diff_X = 0;
        diff_Y = 0;
    }
    //旋转操作
    void RotateGameObject(GyroGameObject gyroGameObject)
    {
        if (gyroGameObject == null || gyroGameObject.go == null)
            return;

#if UNITY_EDITOR
        m_CurGyroX = valueGyroX;
#else
        m_CurGyroX = gyro.gravity.x;
#endif
        if (gyroGameObject.m_IsBack)
        {
            m_CurGyroX = 0 - m_CurGyroX;
        }
        float defY = gyroGameObject.m_StartVec3.y;
        float tagetY = m_CurGyroX * gyroGameObject.m_SpeedX + defY;
        if (tagetY < defY - gyroGameObject.m_RangeX)
        {
            tagetY = defY - gyroGameObject.m_RangeX;
        }
        else if (tagetY > defY + gyroGameObject.m_RangeX)
        {
            tagetY = defY + gyroGameObject.m_RangeX;
        }
        //插值计算平滑一点
        Quaternion taget = Quaternion.Euler(gyroGameObject.go.transform.localEulerAngles.x, tagetY, gyroGameObject.go.transform.localEulerAngles.z);
        gyroGameObject.go.transform.rotation = Quaternion.Slerp(gyroGameObject.go.transform.rotation, taget, Time.deltaTime * gyroGameObject.m_LerpParam);
    }
}

四、碰撞跳转移动(用于场景瞬移/传送)

using System.Collections;
using System.Collections.Generic;
//using UnityEditor.VersionControl;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Go : MonoBehaviour
{
    public void Log(string msg)
    {
        Debug.Log(msg);
    }

    //碰撞开始,碰撞后跳转场景  
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Player")
        {
            SceneManager.LoadScene("B");
        }
    }

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值