美文网首页
接上一篇围绕一个点生成一圈物体,然后转动到需要的角度。(某种抽奖

接上一篇围绕一个点生成一圈物体,然后转动到需要的角度。(某种抽奖

作者: Clean_1306 | 来源:发表于2019-03-25 22:01 被阅读0次
image.png
如上图我们要实现以上效果,即让生成的一圈图是斜着的!
至于怎么生成一圈物体,这里不做过多解释,详情请看上一篇:https://www.jianshu.com/p/829f990d81b0(传送门)

1.实现一圈图片斜着的效果:

首先,我们设置相机到合适的位置,然后调整角度即可。如图:

image.png (注意红色框框的地方)

小提示:如果需要在ui或者别的地方上显示这样的效果,但是主摄像机又要拍摄场景,可以考虑用创建多一个摄像机来渲染!然后设置第二个摄像机的里面的参数即可!

image.png
不过需要注意的是,Culling Mask是拍摄选中的Layer的物体,所以需要拍摄的物体也需要设置对应的Layer(如下图)。 image.png

前面的只是开胃小菜,接下来,我们进入主题:

需求:实现一个转动抽奖的效果,按下按键后开始转动,按下停止按键后开始减速停下。

具体上代码吧,感觉不需要过多解释了:

不过需要注意的是,这个脚本是挂在要转动的物体上,然后围绕这个物体生成一圈子物体!

using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 转动的状态控制
/// </summary>
public enum RotationState
{
    None = 0,
    Trun,
    Stop,
    Stoped,
}

public class MyTest : MonoBehaviour
{
    //一个无关代码的注释:重点,我生成的物体起点是从靠近屏幕这边开始的起点,具体用的操作是设置挂载此脚本的Scale的Z为-1



    public GameObject go_Prefab;   //生成的prefab
    public float fRadius = 500;    //圆的半径
    private int m_MaxRotNumber = 20;
    private float m_IntervalAngle = 18f;//间隔角度

    private List<GameObject> IconObj = new List<GameObject>();
    private List<RotTran> m_RectTrans = new List<RotTran>();
    private List<float> IconObjYpos = new List<float>();

    private RotationState enumRotationState = RotationState.None;//当前状态

    float fStopTargetAngle = 0;       //停止的目标角度
    float fAngle = 0;                 //旋转的角度
    public float fRotationSpeed = 200;       //旋转速度
    float fOriginRotationSpeed = 0;   //用来记录旋转速度,用来重置数据
    float fSlowDownRotationSpeed = 50;//最慢旋转速度

    private struct RotTran
    {
        public Vector3 r_Pos;
        public Vector3 r_Eul;


        public RotTran(Vector3 pos, Vector3 eul)
        {
            r_Pos = pos;
            r_Eul = eul;
        }
    }

    private RotTran NewRot;

    // Use this for initialization
    void Start()
    {
        fOriginRotationSpeed = fRotationSpeed;

        for (int a = 0; a < m_MaxRotNumber; a++)
        {
            GameObject newTemp = GameObject.Instantiate(go_Prefab);
            newTemp.name = a.ToString();
            newTemp.transform.parent = this.transform;
            IconObj.Add(newTemp);
            //生成位置信息,圆形的公式
            // x = 原点x + 半径 * 邻边除以斜边的比例,   邻边除以斜边的比例 = cos(弧度) , 弧度 = 角度 *3.14f / 180f(大致的参考公式)
            NewRot = new RotTran(new Vector3((Mathf.Sin((m_IntervalAngle * a) / 180 * Mathf.PI) * fRadius), 0, fRadius * Mathf.Cos((m_IntervalAngle * a) / 180 * Mathf.PI)), new Vector3(0, m_IntervalAngle * a, 0));
            m_RectTrans.Add(NewRot);
            IconObjYpos.Add(NewRot.r_Pos.y);
        }

        //设置位置和旋转
        for (int i = 0; i < IconObj.Count; i++)
        {

            //IconObj[i].transform.localScale = Vector3.one;
            IconObj[i].transform.localPosition = m_RectTrans[i % IconObj.Count].r_Pos;
            IconObj[i].transform.localEulerAngles = m_RectTrans[i % IconObj.Count].r_Eul;
        }
    }

    // Update is called once per frame
    void Update()
    {

        switch (enumRotationState)
        {
            case RotationState.None:
                break;
            case RotationState.Trun:
                TurnChild();
                break;
            case RotationState.Stop:
                StopRotation();
                break;
            case RotationState.Stoped:
                ReSetAllData();
                break;
        }

        if (Input.GetKeyDown(KeyCode.A) && enumRotationState == RotationState.Trun)
        {
            SetStop();
        }
        if (Input.GetKeyDown(KeyCode.S) && enumRotationState == RotationState.None)
        {
            enumRotationState = RotationState.Trun;
        }
    }

    /// <summary>
    /// 旋转
    /// </summary>
    void TurnChild()
    {
        fAngle += fRotationSpeed * Time.deltaTime;
        transform.rotation = Quaternion.Euler(new Vector3(0, fAngle, 0));
        if (IconObj[0].transform.position.x < 0)//<0为顺时针旋转,判断子物体的x轴世界坐标是否小于0,小于0则进入处理,
        {
            GameObject tempGo = IconObj[0];
            tempGo.transform.SetSiblingIndex(transform.childCount - 1);//将此物体的层级设置到最后一个
            IconObj.RemoveAt(0);
            IconObj.Add(tempGo);
        }
    }

    /// <summary>
    /// 设置停止信号
    /// </summary>
    void SetStop()
    {
        fAngle = 0;
        fStopTargetAngle = 360 + IconObj[0].transform.localEulerAngles.y;
        Debug.Log(IconObj[0].name);
        enumRotationState = RotationState.Stop;
    }

    /// <summary>
    /// 停止旋转
    /// </summary>
    void StopRotation()
    {
        fAngle += fRotationSpeed * Time.deltaTime;
        fRotationSpeed -= 50 * Time.deltaTime;
        fRotationSpeed = Mathf.Clamp(fRotationSpeed, fSlowDownRotationSpeed, 200);
        if (fAngle >= fStopTargetAngle)
        {
            fAngle = fStopTargetAngle;
            enumRotationState = RotationState.Stoped;
        }
        transform.rotation = Quaternion.Euler(new Vector3(0, fAngle, 0));
        if (IconObj[0].transform.position.x < 0)//<0为顺时针旋转
        {
            GameObject tempGo = IconObj[0];
            tempGo.transform.SetSiblingIndex(transform.childCount - 1);
            IconObj.RemoveAt(0);
            IconObj.Add(tempGo);
        }
    }

    /// <summary>
    /// 重置数据
    /// </summary>
    void ReSetAllData()
    {
        fAngle = 0;
        fStopTargetAngle = 0;
        fRotationSpeed = fOriginRotationSpeed;
        enumRotationState = RotationState.None;
    }
}

相关文章

  • 接上一篇围绕一个点生成一圈物体,然后转动到需要的角度。(某种抽奖

    1.实现一圈图片斜着的效果: 首先,我们设置相机到合适的位置,然后调整角度即可。如图: 小提示:如果需要在ui或者...

  • Unity围绕一个点生成一圈物体

    有时候,会有一些这样的需求,就是围绕一个点,生成一圈物体。首先,要记住一个固定的公式:原点 + 半径 * 邻边除以...

  • 抽奖(接上)

    果不其然,我抽的依旧还是纪念奖。虽然在将手伸进抽奖箱时,有那么一个瞬间心怀奢望,近乎虔诚的小心将手伸进奖台上留着巴...

  • Unity中找到几个物体的中心点

    很好理解,就是几个物体的位置相加然后除以物体数量即可得到 比如寻找子物体的中心点 直接上代码 也可以用for循环 ...

  • Target Joint 2D 目标关节

    相对关节的简化版,刚体会以弹簧的行为移动到Target点。用作鼠标点击物体拖动到一个其他点的效果。

  • 计划赶不上变化

    假期将至,本来我计划得好好的,早晨五点起床,然后边徒步边完成抽奖,听三集《明朝那些事儿》,菜市场转一圈,买下一天的...

  • 第三步、细分物体

    在物体模式下,按照示例步骤添加一个细分修改器。 然后进入编辑模式,按快捷键“ctrl+r”,然后将光标移动到物体外...

  • 三十而立的土星周期|《29+1》

    土星围绕太阳转绕一圈需要约30年,三十而立的这年,代表着,从你出生到30岁这年,土星围绕着太阳满满地跑了一圈。 红...

  • 2019-01-03

    1.物体沿直线移动的运动叫做平移。 2.物体围绕一点转动的运动叫做旋转。 3.对折后能完全重合的图形是轴对称图形。...

  • 某种。角度。

    伽利略在斜塔上做自由落体的时候,应该是阳光明媚的吧。她一到比萨,便倾盆大雨。 她曾希望亲手从斜塔顶上投下理想与现...

网友评论

      本文标题:接上一篇围绕一个点生成一圈物体,然后转动到需要的角度。(某种抽奖

      本文链接:https://www.haomeiwen.com/subject/zqjivqtx.html