用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c#代码库

Unity3d中寻找并锁定对象

2015-07-22 作者: 越傻越快乐举报

[c#]代码库

// 这个是寻找在范围内距离最近的目标的代码片段,适合用于武器锁定之类

// 是否开启寻找锁定器?
if(Seeker) {
	// 遍历所有目标对象
	for (int t = 0; t < TargetTag.Length; t++) {
		if (GameObject.FindGameObjectsWithTag(TargetTag[t].Length > 0)) {
			GameObject[] objs = GameObject.FindGameObjectsWithTag(TargetTag[t]);

			float distance = int.MaxValue;
			for (int i = 0; i < objs.Length; i++) {
				if (objs[i]) {
					// 这两段代码的作用是用于计算对象与角色之间夹角的余弦值,再根据余弦值来判断对象是否在目标范围内
					// 这里应用到的数学知识是两个向量a,b的点乘相当于a,b的模相乘,再与它们之间的余弦值相乘。
					// 先求出对象与角色之间的方向向量,再单位化,则它的模就为1了
					// transform.forward相对于角色前进方向(z轴)的方向向量,它的模是1
					// 因此变量direction就是它们两个方向向量的余弦值了。
					Vector3 dir = (objs[i].transform.position - transform.position).normalized;
					float direction = Vector3.Dot(dir, transform.forward);

					// 求得两个对象之间的距离
					float dis = Vector3.Distance(obj[i].transform.position, transform.position);

					// 若果对象在目标范围之内, 记得direction是余弦值,
					if (direction >= AimDirection) {
						// 若果对象在目标距离之内
						if (DistanceLock > dis) {
							// 选择距离最近的
							if (distance > dis) {
								// 离上一次锁定的时间大于TimeToLock才能重新锁定
								if (timeToLockCount + TimeToLock < Time.time) {
									distance = dis;
									target = objs[j];
								}
							}
						}
					}
				}
			}
		}
	}
}

// 是否有锁定了的目标?
if (target) {
	float targetDistance = Vector3.Distance(transform.position, target.transform.position);
	Vector3 dir = (target.transform.position - transform.position).normalized;
	float direction = Vector3.Dot(dir, transform.forward);

	// 若果已经锁定了的目标不再符合锁定的条件,就应该要解锁了
	if (targetDistance > DistanceLock || direction <= AimDirection) {
		Unlock();
	}
}

void Unlock() {
	// 保存解锁的时间
	timeToLockCount = Time.time;
	target = null;
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...