01、碰撞检测
两物体上都加了碰撞器(Collider),且至少其中一个添加了刚体(Rigidbody)组件才能
被检测到。
//自动调用
private void OnCollisionEnter(Collision collision)
{
print("OnCollisionEnter");
//碰撞信息检测
print(collision.collider);
print(collision.collider.name);
print(collision.collider.tag);
}
private void OnCollisionStay(Collision collision)
{
print("OnCollisionStay");
}
private void OnCollisionExit(Collision collision)
{
print("OnCollisionExit");
}
02、触发检测
勾选碰撞器(Collider)组件中的"Is Trigger",碰撞器就变成了触发器了(加了触发器
的物体其他物体可进入其内部,加了碰撞器的物体与其他物体接触会发生碰撞,无法进
入物体内部)
//自动调用
private void OnTriggerEnter(Collider other)
{
//触发信息检测
print("OnTriggerEnter:" + other);
print(other.name);
print(other.tag);
}
private void OnTriggerStay(Collider other)
{
print("OnTriggerStay:" + other);
}
private void OnTriggerExit(Collider other)
{
print("OnTriggerExit:" + other);
}
03、光照贴图(Lightmapping)
如果不使用光照贴图,光源对场景的影响是需要实时计算的,较耗费性能,使用Lightmapping光照信息会被提前计算好,然后烘培成一个贴图,把贴图放到模型上,就不用实时计算了。
1、Unity--->Window--->Rendering--->Lighting Settings;
2、把所有灯光勾选"Static";
3、所有灯光--->Inspector--->Light--->Mode--->选择Baked;
4、点击"Generate Lighting"进行烘培(每次修改需重新烘培)
5、此时禁用所有灯光,场景中光源对场景的影响依然存在。
04、不同类属性的调用
调用类属性需“public”,unity中创建C#脚本,生成的类为主类,脚本中自己又创建的类为副类。
public class LearnCSharp : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Enemy ene1 = new Enemy();
ene1.name = "enemy1";
}
}
class Enemy
{
public string name;
float hp = 80;
}
05、枚举的使用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//enum RoleType:byte //默认为int,可修改为其他类型
enum RoleType
{
shooter,//射手 默认代表整数0
master,//法师 默认代表整数1
warrior//战士 默认代表整数2
}
public class LearnCSharp : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
RoleType playerRoleType = RoleType.shooter;
//int num = (int)playerRoleType;//显性转换成角色类型代表的整数
if (playerRoleType == RoleType.master)
{
print("玩家角色为法师");
}
else if (playerRoleType == RoleType.shooter)
{
print("玩家角色为射手");
}
else
{
print("玩家角色为战士");
}
}
}
//switch case标准用法,此处和用else if效果一样
RoleType playerRoleType = RoleType.shooter;
switch (playerRoleType)
{
case RoleType.shooter:
print("玩家角色为射手");
break;
case RoleType.master:
print("玩家角色为法师");
break;
case RoleType.warrior:
print("玩家角色为战士");
break;
default:
print("都不满足");
break;
06、for循环和while循环和foreach遍历
void Start()
{
Transform[] des = transform.GetComponentsInChildren<Transform>();
//for循环用法
//for(int i = 0; i < des.Length; i++)
//{
// if (des[i] != transform)
// {
// print(i);
// GameObject.Destroy(des[i].gameObject);
// }
//}
//while循环用法
//int i = 0;
//while (i<des.Length)
//{
// if (des[i] != transform)
// {
// print(i);
// GameObject.Destroy(des[i].gameObject);
// }
// i++;
//}
//foreach遍历 t代表遍历的每一个元素
foreach(Transform t in des)
{
if (t != transform)
{
print(t);
GameObject.Destroy(t.gameObject);
}
}
}
07、组件(物体)的禁用和激活
box.enabled = false; //false或true
go.SetActive(false);
08、结构体
using System;
namespace CSharpLearn
{
struct Posion
{
public float x;
public float y;
public float z;
}
class Program
{
static void Main(string[] args)
{
Posion playerPos;
playerPos.x = 10.5f;
Posion enemyPos;
enemyPos.y = 2.6f;
Console.ReadKey();
}
}
}
using System;
/*
示例2:
定义一个表示路径的结构,路径有一个方向和距离组成(假定方向只有东西南北)
*/
namespace CSharpLearn
{
struct Route
{
public Dir direction;
public float distance;
}
enum Dir
{
east,
west,
south,
north
}
class Program
{
static void Main(string[] args)
{
Route playerRou;
playerRou.direction = Dir.east;
playerRou.distance = 1000;
Console.ReadKey();
}
}
}
09、使用Array.sort和冒泡排序算法(依次和后一位比较,前面大于后面位置互换,前面小于后面位置不变,每轮确定最后一个数是最大的)
示例:编写一个控制台程序,要求用户输入一组数字,用空格隔开,对用户输入的数字从小到大排列
string str= Console.ReadLine();
string[] strArray = str.Split(' ');
int[] numArray = new int[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
numArray[i] = Convert.ToInt32(strArray[i]);
Console.WriteLine(numArray[i]);
}
//第一种
//Array.Sort(numArray); //使用CLR给我们提供的方法进行排序(快速排序算法)
//第二种 冒泡排序
for(int l = 0; l < numArray.Length - 2; l++)
{
for (int k = 0; k < numArray.Length - 1; k++)
{
if (numArray[k] > numArray[k + 1])
{
int tem = numArray[k];
numArray[k] = numArray[k + 1];
numArray[k + 1] = tem;
}
}
}
//输出
for (int j = 0; j < numArray.Length; j++)
{
Console.Write(numArray[j] + " ;");
}
Console.ReadKey();
10、示例
有n个整数,已经按照从小到大的顺序排列好,现在用户输入一个整数,请将该数插入到序列中,并使新的数列仍然有序。
//原数组
int[] array = { 3, 15, 78, 156, 788, 996, 4067 };
int index = 0;
Console.WriteLine("请输入一个数字");
int userInput = Convert.ToInt32(Console.ReadLine());
bool insert = false; //判断是否插入,默认为false
//插入后新数组
int[] newArray = new int[array.Length + 1];
for(int i = 0; i < newArray.Length; i++)
{
//当插入值为newArray数组最后位置
if (i == array.Length && insert == false)
{
newArray[newArray.Length - 1] = userInput;
insert = true;
}
else if (userInput <= array[index]&&insert==false)
{
newArray[i] = userInput;
insert = true;
}
else
{
newArray[i] = array[index];
index++;
}
}
//输出对比
Console.WriteLine("插入前");
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i] + " ;");
}
Console.WriteLine();
Console.WriteLine("插入后");
foreach (int num in newArray)
{
Console.Write(num + " ;");
}
Console.ReadKey();