一. 为物体施加一个向上的力, 使物体的重力和上升力平衡
/// <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);
}
}
}
}