public AdvCommandSetPivot(StringGridRow row, AdvSettingDataManager dataManager) : base(row) { targetName = this.ParseCell <string>(AdvColumnName.Arg1); string strPivotX = ParseCell <string>(AdvColumnName.Arg2); switch (strPivotX) { case AdvCommandKeyword.Left: pivotX = 0.0f; break; case AdvCommandKeyword.Center: pivotX = 0.5f; break; case AdvCommandKeyword.Right: pivotX = 1.0f; break; default: pivotX = this.ParseCell <float>(AdvColumnName.Arg2); break; } string strPivotY = ParseCell <string>(AdvColumnName.Arg3); switch (strPivotY) { case AdvCommandKeyword.Bottom: pivotY = 0.0f; break; case AdvCommandKeyword.Center: pivotY = 0.5f; break; case AdvCommandKeyword.Top: pivotY = 1.0f; break; default: pivotY = this.ParseCell <float>(AdvColumnName.Arg3); break; } x = this.ParseCellOptional <float>(AdvColumnName.Arg4, 0.0f); y = this.ParseCellOptional <float>(AdvColumnName.Arg5, 0.0f); pivotType = this.ParseCellOptional(AdvColumnName.Arg6, AdvGraphicObjectPivotType.SpritePos); }
//ピボットの中心となる対象のローカル座標で取得 Vector3 GetPivotTargetInSpriteSpace(float pivotX, float pivotY, float offsetX, float offsetY, AdvGraphicObjectPivotType pivotType) { var childTransform = TargetObject.transform; var childRectTransform = childTransform as RectTransform; if (childRectTransform == null) { Debug.LogError(this.gameObject.name + "is not RectTransform type"); return(Vector3.zero); } //ピボットを対象のローカル座標に返還 Vector3 local = childRectTransform.PivotToLocalPoint(new Vector2(pivotX, pivotY)); switch (pivotType) { case AdvGraphicObjectPivotType.SpritePos: { //子オブジェクトのスケール値を無視する形に Vector2 scale = childRectTransform.localScale; if (Mathf.Approximately(0, scale.x)) { scale.x = 1; } if (Mathf.Approximately(0, scale.y)) { scale.y = 1; } local.x += offsetX / scale.x; local.y += offsetY / scale.y; } break; case AdvGraphicObjectPivotType.SpritePosLocal: { //指定の値だけずらす local.x += offsetX; local.y += offsetY; } break; case AdvGraphicObjectPivotType.SpritePosNoSize: //ここではオフセット適用しない break; default: Debug.LogError(pivotType + " is Failed");; break; } var world = childTransform.LocalPointToWorldPoint(local); switch (pivotType) { case AdvGraphicObjectPivotType.SpritePosNoSize: //ここでオフセット適用 world.x += offsetX / Layer.Manager.PixelsToUnits; world.y += offsetY / Layer.Manager.PixelsToUnits; break; default: break; } return(world); }
//ピボットの中心となるポイントをワールド座標で取得 Vector3 GetPivotTargetWorldPoint(float pivotX, float pivotY, float offsetX, float offsetY, AdvGraphicObjectPivotType pivotType) { switch (pivotType) { case AdvGraphicObjectPivotType.WorldSpace: //ワールドスペースの場合のピボット点を取得 return(GetPivotTargetInWorldSpace(pivotX, pivotY, offsetX, offsetY)); default: return(GetPivotTargetInSpriteSpace(pivotX, pivotY, offsetX, offsetY, pivotType)); } }
internal void SetPivot(float pivotX, float pivotY, float offsetX, float offsetY, AdvGraphicObjectPivotType pivotType) { if (TargetObject == null) { return; } if (pivotType == AdvGraphicObjectPivotType.Direct) { //直接指定する場合 rectTransform.SetPivotKeepRect(new Vector2(pivotX, pivotY)); return; } //その他の場合は、いったん目標のポイントのワールド座標を取得して、それをpivot座標に変換する Vector3 worldPoint = GetPivotTargetWorldPoint(pivotX, pivotY, offsetX, offsetY, pivotType); Vector2 pivot = rectTransform.WorldPointToPivot(worldPoint); rectTransform.SetPivotKeepRect(pivot); }