Unity四元素运用之风向标跟随箭头

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class WindVaneCom : MonoBehaviour

{

public static WindVaneCom instance

{

get;

private set;

}

public bool isOn = false;

public Camera cam;

public GameObject T;

public GameObject V;

public float PivotXY = 75f;

public float scoX = 220f;

public float scoY = 270f;

private float AtX;

private float AtY;

private Vector2 v2 = Vector2.one;

private Vector2 v2new = Vector2.one;

private Vector3 v3 = Vector3.one;

private Quaternion qua = Quaternion.identity;

void Awake()

{

instance = this;

}

public void SetGameobj(Camera ca, GameObject v, GameObject t)

{

cam = ca;

T = t;

V = v;

}

// Update is called once per frame

void Update()

{

if (isOn)

{

ObjectCom com = CreatureModel.Instance.GetCurrentObjCom();

if (com != null)

{

T = com.gameObject;

}

if (V == null || T == null)

{

Debug.Log("V==null||T==null");

return;

}

if (null != Camera.main)

{

cam = Camera.main;

v2 = cam.WorldToScreenPoint(T.transform.position);

}

else

{

Debug.Log("null == Camera.main");

// cam = Camera.current;

}

if ((v2.x >= (0 - scoX) && v2.x <= (Screen.width + scoX)) && (v2.y >= (0 - scoY) && v2.y <= (Screen.height + scoY)))

{

V.SetActive(false);

}

else

{

V.SetActive(true);

}

if (v2.x < -scoX)

{

AtX = PivotXY;

if (v2.y > 0 && v2.y < Screen.height)

{

AtY = v2.y;

V.SetActive(true);

}

}

if (v2.x > (Screen.width + scoX))

{

AtX = Screen.width - PivotXY;

if (v2.y > 0 && v2.y < Screen.height)

{

AtY = v2.y;

V.SetActive(true);

}

}

if (v2.y < -scoY)

{

AtY = PivotXY;

if (v2.x > 0 && v2.x < Screen.width)

{

AtX = v2.x;

V.SetActive(true);

}

}

if (v2.y > (Screen.height + scoY))

{

AtY = Screen.height - PivotXY;

if (v2.x > 0 && v2.x < Screen.width)

{

AtX = v2.x;

V.SetActive(true);

}

}

v2new.x = AtX;

v2new.y = AtY;

V.GetComponent<RectTransform>().anchoredPosition = v2new;

qua.SetLookRotation(V.transform.position, T.transform.position);

v3 = qua.eulerAngles;

// V.transform.rotation = Quaternion.Euler(0, 0, v3.z);

V.transform.rotation = Quaternion.Euler(v3.x, 0, v3.z);

}

else

{

if (V != null)

V.SetActive(false);

}

}

void OnDestory()

{

instance = null;

}

}

原文地址:https://www.cnblogs.com/cxihu/p/10274000.html

时间: 2024-08-28 20:50:22

Unity四元素运用之风向标跟随箭头的相关文章

四元素还是向量?

ywlj 四元素是描述运动物体姿态的终极武器.它是由威廉·哈密顿(William Rowan Hamilton)爵士1843年在爱尔兰发现的. 会中文的数学家哈密顿生于爱尔兰,他在十三岁前都受其叔父语言学家詹姆斯照顾.哈密顿很喜欢文学,在大学期间,他不但修读数学,还有修读经典文学.因此,他总共精通十二种语言.除了欧洲语言之外,他还懂得波斯语.马来语.阿拉伯语.梵文和中文等.他的妻子是一个神父的女儿.哈密顿最大的成就在于发现了四元数,并将之广泛应用于物理学各方面.哈密顿对光学.动力学和代数的发展提

性味归经与功能的脚本(超过四元素)

脚本名称 censor_relation_xwgj2_functions.py 需要导入中药表excel # -*- coding: utf-8 -*- """ Created on Thu Aug 25 10:06:52 2016 审核性味归经与功能的脚本(超过四元素) @author: Administrator """ import xlrd,csv import list_xwgj_function,chi_square,list_xwg

四元素与矩阵之间相互转换

1.矩阵转换为四元素 public static Quaternion QuaternionFromMatrix(Matrix4x4 m) { Quaternion q = new Quaternion(); q.w = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] + m[1, 1] + m[2, 2])) / 2; q.x = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] - m[1, 1] - m[2, 2])) / 2; q.y = M

Unity的四元素与Vector3的乘积的含义

Quaternion.Euler(x,y,z)含义是按照每个旋转轴以x,y,z旋转度旋转,例子:Quaternion.Euler(45,45,45) Quaternion与Vector3的右乘操作(*)返回一个将原有向量做旋转操作后的新向量 列如:Quaternion.Euler(0,90,0)*Vector3(0.0,0.0,-10) 相当于把向量Vector3(0.0,0.0,-10)绕y轴旋转90度,得到的结果为Vector3(-10,0.0.0.0) 原文地址:https://www.c

Unity 编辑器下控制粒子播放跟随位移

在之前的文章<Unity 编辑器下控制播放粒子>讲到在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,但是当这个粒子是挂载在人物身体部位的时候,会有可能出现不跟随位移的情况.查找原因,发现是 Resimulate 被勾选中了,这个选项是指当粒子参数改变时,立即更新粒子效果.要让粒子也能跟随移动,必须将这个选项取消掉. 可以简单的在编辑器下,取消掉这个选项,如下: 但是,对于其他人员可能不知道这个原因,手动设置不够智能,需要进一步在代码中主动控制.操纵这个选项,需要

【小松教你手游开发】【unity实用技能】角色头部跟随镜头旋转

这个在端游上比较场景,在角色展示的时候,当摄像头在角色身边上下左右旋转时,角色头部跟随镜头旋转.如天涯明月刀等. 这个在手游上比较少见,不过实现也没什么区别. 首先一般情况下,找到模型的头部节点,直接用lookAt指向camera就可以了,不过一般需求不会这么简单. 比如说,超过头部扭动极限,头部需要插值回到原始点:当镜头从外部回到极限内,需要插值回来.这时候lookat就没法使用. 更有情况,头部本身坐标系不在世界坐标轴上, 可能旋转了90多或者输出的prefab就是歪的等等,这些情况都没办法

Unity游戏开发第三人称摄像机跟随

在第三人称游戏开发中,因为我们的人物是会不断移动的,所以我们的相机需要保持合适的角度跟随我们的人物进行移动,最简单的一种实现方法是先在unity场景中将摄像机调整到合适的位置,然后将它放到我们的人物下面,让他成为人物的子物体,这样做也可以达到摄像机跟随的目的.如果对摄像机跟随的要求不高的话可以临时采用这种方法 为了实现第三人称摄像机跟随的功能,大部分情况先我们都是采用编写代码的方法来实现的.下面是本人实现的一种摄像机跟随的方法,仅供参考,实现的功能是按住键盘AD键可以让摄像机视野围绕人物左右移动

Unity学习-元素类型(三)

在看下面操作时,先记住三句话 1.游戏对象 是由 组件 组成的:衣服 2.材质(Material):就是衣服的设计方案 3.纹理(Texture):做衣服的布料 从GameObject到Cube 第一步:创建一个空的游戏对象 第二步: 添加网格过滤器,同时选择类型 [Mesh-Mesh Filter] 第三步:添加碰撞 [Physics-BoxColider] 第四步:添加渲染 [Mesh-Mesh Filter]   添加Material 第一步:添加Material [Assets-Crea

Unity四种路径总结

四种路径的权限:                                            Application.dataPath 包含游戏数据文件夹的路径(只读) Application.persistentDataPath 包含一个持久数据目录的路径(可读可写) Application.streamingAssetsPath  包含一个到StreamingAssets文件夹的路径.(读) Application.temporaryCachePath 包含一个临时数据/缓存目录的