Unity实用脚本片段总结

一. 为物体施加一个向上的力, 使物体的重力和上升力平衡

    /// <summary>
    /// 为物体施加一个向上的力, 使物体的重力和上升力平衡
    /// 9.81f为Unity中的重力加速度
    /// </summary>
    void FixedUpdate()
    {
       GetComponent<Rigidbody>().AddForce(Vector3.up * 9.81f * (GetComponent<Rigidbody>().mass));
    }

二. 检测扇形角度

Debug.DrawLine来绘制两条红色的线,用来显示所在的区域。

//目标位置与当前位置的距离
float distance = Vector3.Distance(target.transform.position, transform.position);
//返回向右旋转30度的四元数
Quaternion right = transform.rotation * Quaternion.AngleAxis(30, Vector3.up);
//返回向左旋转30度的四元数
Quaternion left = transform.rotation * Quaternion.AngleAxis(30, Vector3.down);
Vector3 n = transform.position + (Vector3.forward * distance);
//旋转30度后的向量
Vector3 leftPoint = left * n;
Vector3 rightPoint = right * n;
//绘制射线进行显示
Debug.DrawLine(transform.position, leftPoint, Color.red);
Debug.DrawLine(transform.position, rightPoint, Color.red);

三. 球形插值 - 太阳升降

public class Sunrise2Sunset : MonoBehaviour
{
    public Transform sunrise;
    public Transform sunset;

    // 日出到日落的时间
    public float journeyTime = 1.0f;

    // 动画开始时间
    private float startTime;

    void Start()
    {
        startTime = Time.time;
    }

    void Update()
    {
        // 圆弧的中心
        Vector3 center = (sunrise.position + sunset.position) * 0.5F;

        // 将中心向下移动一点
        center -= new Vector3(0, 1, 0);

        // 相对于中心的弧线插值
        Vector3 riseRelCenter = sunrise.position - center;
        Vector3 setRelCenter = sunset.position - center;

        // 到目前为止发生动画的部分是经过时间 / 所需时间
        // 总旅程
        float fracComplete = (Time.time - startTime) / journeyTime;

        transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete);
        transform.position += center;
    }
}

四. 遍历删除元素

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


public class TraversesDeleteElement : MonoBehaviour
{
    Dictionary<int, string> dic = new Dictionary<int, string>();
    List<string> names = new List<string>() { "张三", "李四", "李四", "王五", "赵六" };


    #region 遍历集合删除元素
    /// <summary>
    /// 暂存元素遍历删除
    /// </summary>
    private void BackupListDelete()
    {
        List<string> newNames = new List<string>();
        foreach (var item in names)
        {
            if (item.Equals("李四"))
            {
                newNames.Add(item);
            }
        }
        foreach (var item in newNames)
        {
            names.Remove(item);
        }
        foreach (var item in names)
        {
            Debug.Log("暂存元素遍历删除: " + item);
        }
    }

    /// <summary>
    /// for循环倒序遍历删除
    /// </summary>
    private void DescDelete()
    {
        for (int i = names.Count - 1; i > 0; i--)
        {
            if (names[i].Equals("李四"))
            {
                names.Remove(names[i]);
            }
        }
        foreach (var item in names)
        {
            Debug.Log("for倒序: " + item);
        }
    }

    /// <summary>
    /// for循环正序遍历删除  这是个错误方法
    /// </summary>
    private void OrderDelete()
    {

        for (int i = 0; i < names.Count; i++)
        {
            if (names[i].Equals("李四"))
            {
                names.Remove(names[i]);
            }
        }
        foreach (var item in names)
        {
            Debug.Log("for正序: " + item);
        }
    }
    #endregion

    // Start is called before the first frame update
    void Start()
    {
        //string n = "grayworm";
        //Type t = n.GetType();
        //foreach (MemberInfo mi in t.GetMembers())
        //{
        //    Debug.Log(string.Format("{0}\t{1}", mi.MemberType, mi.Name));
        //}

        dic.Add(1,"1");
        dic.Add(2,"2");
        dic.Add(3,"3");
        dic.Add(4,"4");
        dic.Add(5,"5");
        foreach (int key in new List<int>(dic.Keys))
        {
            if(key == 3)
            {
                dic.Remove(3);
            }
        }

        OrderDelete();
        DescDelete();
        BackupListDelete();

    }

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

    }
}

五.序列化字典Dictionary

public class GameManager : MonoBehaviour
{
    // 甜品的种类
    public enum SweetsType
    {
        EMPTY,
        NORMAL
    }

    // 甜品预制体的字典,可通过甜品种类,查到对应的甜品游戏物体
    public Dictionary<SweetsType, GameObject> sweetPrefabDict;

    [System.Serializable]
    public struct SweetPrefab
    {
        public SweetsType type;
        public GameObject prefab;
    }

    public SweetPrefab[] sweetPrefabs;

    private void Start()
    {
        // 字典内容
        sweetPrefabDict = new Dictionary<SweetsType, GameObject>();
        for (int i = 0; i < sweetPrefabs.Length; i++)
        {
            if (!sweetPrefabDict.ContainsKey(sweetPrefabs[i].type))
            {
                sweetPrefabDict.Add(sweetPrefabs[i].type, sweetPrefabs[i].prefab);
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值