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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 大三下学期了,迷茫这个词于我似乎不达边,即使不是很清楚自己明确的目标,但也有一个大致的方向。翻起我大一时候的日...
    ___十三月__阅读 368评论 0 4
  • 《金融时报》介绍了学者莫腾·汉森的新书《玩转工作》(Great at Work)。汉森在书中提出了一个工作理念:“...
    金雪一阅读 315评论 1 1
  • 最近玩的好的朋友谈恋爱了,我觉得很为她高兴。二十二年的单身狗,终于可以好好享受恋爱的滋味了,记得她打电话过来和...
    阿狸璐吖阅读 154评论 0 0